使用ANTLR 3,我的词法分析器有规则
SELECT_ASSIGN:
'SELECT' WS+ IDENTIFIER WS+ 'ASSIGN' WS+ (('TO'|'USING') WS+)?
正确使用这些匹配
SELECT VAR1 ASSIGN TO
SELECT VAR1 ASSIGN USING
这也匹配
SELECT VAR1 ASSIGN FOO
但是这与
不匹配SELECT VAR1 ASSIGN TWO
我在规则中将TO | USING标记为可选。
从生成的Java代码中我看到...... 当词法分析器注意到TW为T时,它会匹配('TO') 但是因为在T之后没有找到O. 然后生成失败....并从规则中一直返回 - 因此不匹配它。
如果输入的字符以字符的后缀可选部分开头的字符
,我如何让我的词法分析器规则匹配?基本上我希望我的规则也能与之相匹配(除了它已经匹配的东西 - 就像开头一样):
SELECT VAR1 ASSIGN TWO
请建议我如何处理/解决这种情况。
注:
在解析器中建议使用这样的规则 - 但我在词法分析器中有这个 - 因为我不想解析器解析整个输入,并且只想解析感兴趣的内容。所以在词法分析器中使用这样的规则,我找到了解析器真正要解析的部分。
更新1 我可以通过制定2条规则来解决这个问题:
SELECT_ASSIGN_USING_TO
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' WS+ ('USING'|'TO')
SELECT_ASSIGN
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN'
但是有可能在一个词法分析器规则中执行所需的操作吗?
答案 0 :(得分:0)
我的大四学生建议在一条规则中得到这个的方法 - 使用句法谓词
NODE_PATH=. react-scripts start
答案 1 :(得分:0)
标记匹配完整的char序列或没有。它无法部分匹配,语法规则确切地确定了哪一个。您不能指望TO
的规则与TWO
匹配。如果您希望TWO
匹配,则必须将其添加到词法分析器规则中。
这里有几点说明:
string
等语言的基本结构,
number
,comment
等。)。