解析器中的冲突解决与错误处理技巧
1. 语法冲突类型及解决方法
1.1 循环嵌套冲突(Shift/Reduce)
当语法中有两个嵌套的列表创建循环,且没有标点符号指示外部列表条目的边界时,就会出现这种冲突。例如以下语法:
start: outerList Z ; outerList: /* empty */ | outerList outerListItem ; outerListItem: innerList ; innerList: /* empty */ | innerList innerListItem ; innerListItem: I ;解决冲突的方法取决于你希望重复项如何处理:
- 若希望有多个外部循环,则移除内部循环:
start: outerList Z ; outerList: /* empty */ | outerList innerListItem ; innerListItem: I ;- 若希望有多个内部循环,则移除外部循环:
start: innerList Z ; innerList: /* empty */