我正在使用 altlr 3.4 版。
第一个问题,请看语法:
request: 'C' DELIM source DELIM target
{ System.out.println("Hi"); }
;
source: ID ;
target: ID ;
DELIM: '|' ;
fragment ALPHA: 'a'..'z' | 'A'..'Z' ;
fragment NUM: '0'..'9' ;
ID: ALPHA (ALPHA | NUM)* ;
“源”和“目标”不能为空。但我的测试显示以下内容:
- 对于输入 "C|n1|n2" :正常情况,没问题。
- 对于输入“C||n2”:语法错误,并且未打印“Hi”。预期的。好的
- 对于输入“C|n1|” : 语法错误,但打印“Hi”。不好。
如果达到“请求”令牌,我确实需要设置其他内容。但是从上面看,即使是语法错误,代码仍然会到达“请求”令牌。为什么?
第二个问题:如何为固定长度令牌指定规则,例如,精确 10 位的令牌?
第三个问题是关于错误处理的。我在解析器中覆盖了 emitErrorMessage() 以设置错误标志,但我在词法分析器中发现了另一个 emitErrorMessage() 。我不想在解析器和词法分析器对象之间共享错误标志。我可以在词法分析器中覆盖 emitErrorMessage() 而不做任何事情,并且完全依赖解析器来报告错误吗?或者换一种说法,如果有错误,解析器会确定捕获它吗?
并且如果为一个错误设置了错误标志,那么解析器是否真的可以恢复并匹配另一个规则,所以之前的错误是误报?
谢谢你的帮助!