我有以下语法:
cmds
: cmd+
;
cmd
: include_cmd | other_cmd
;
include_cmd
: INCLUDE DOUBLE_QUOTE FILE_NAME DOUBLE_QUOTE
;
other_cmd
: CMD_NAME ARG+
;
INCLUDE
: '#include'
;
DOUBLE_QUOTE
: '"'
;
CMD_NAME
: ('a'..'z')*
;
ARG
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')+
;
FILE_NAME
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '.')+
;
所以 CMD_NAME、ARG 和 FILE_NAME 的区别不大,CMD_NAME 必须是小写字母,ARG 可以有大写字母和“_”,而 FILE_NAME 可以有“.”。
但这有一个问题,当我用-#include“abc”测试规则时,'abc'被解释为CMD_NAME而不是FILE_NAME,我认为这是因为CMD_NAME在语法文件中的FILE_NAME之前,这导致解析错误。
我是否必须依靠 predict 之类的技术来处理这个问题?除了依赖宿主编程语言,还有纯 EBNF 解决方案吗?
谢谢。