2016-03-03 177 views
1

我在阅读ANTLR4的防御指南,现在我在关于词法分析规则解析的部分。这是什么写在本节:了解ANTLR4中的词法分析规则解析

grammar KeywordTest; 
enumDef : 'enum' '{' ... '}'; 
... 
FOR: 'for' 
... 
ID:[a-zA-Z]; // does not match 'enum' or 'for' 

规则ID也可以匹配kewords如enumfor,这意味着 有不止一个规则可以匹配相同 字符串。 [...] 字面如'enum'成为词法规则去 的语法规则后立即但明确的词汇 规则之前。

这是什么意思?它是如何帮助我们解决潜在的歧义?我要说的是,像

ENUM_KEYWORD: 'enum' 

ATNLR4的声明可能会在内部使用规则enumDef: 'enum' '{' ... '}之后将decalred并且将如下所示:

enumDef: ENUM_KEYWORD '{' ... '} 
ENUM_KEYWORD: 'enum' 

那是究竟是如何ANTLR4做的事情?

回答

1

词法规则的顺序在语法中非常重要,因为将使用找到的第一条适用规则。你可以阅读更多here

所以,如果你有词法规则:

ID: [a-zA-Z]+; 
FOR: 'for'; 

基于其输入订单“为”将被标记为令牌或ID令牌,因为两者是正确的。

因此,语法经常包含所有关键字都被提及的规则'ambigous',所以当另一个标记包含关键字时它会通过。

例如:

alfaNum: (ALFA | NUM | ambigous | '_')+?; 
ambigous: SELECT | WHERE | FROM | WITH | SET | AS; 

如果有alfaNum令牌 “选择” 这样一来,它会通过。如果ambigous不被指定,它将故障转移词法规则SELECT: 'select';