2013-05-10 90 views
7

我有ANTLR 4以下语法:ANTLR 4词法分析器记号

grammar Pattern; 

//parser rules 
parse : string LBRACK CHAR DASH CHAR RBRACK ; 
string : (CHAR | DASH)+ ; 

//lexer rules 
DASH : '-' ; 
LBRACK : '[' ; 
RBRACK : ']' ; 
CHAR : [A-Za-z0-9] ; 

而且我试图解析以下字符串

ab-cd[0-9] 

代码解析出的ab-cd左侧将在我的应用程序中被视为文字字符串。然后它将[0-9]解析为一个字符集,在这种情况下将转换为任何数字。我的语法适用于我,除非我不喜欢将(CHAR | DASH)+作为解析器规则,因为它仅仅被视为令牌。我宁愿词法分析器创建STRING令牌,给我下面的标记:

"ab-cd" "[" "0" "-" "9" "]" 

,而不是这些

"ab" "-" "cd" "[" "0" "-" "9" "]" 

我已经看过其他的例子,但一直没能弄明白。通常,其他示例的引号围绕这些字符串文字,或者有空格来帮助分隔输入。我想避免这两种情况。这可以用词法规则来实现还是需要像解析器规则那样继续处理它呢?

回答

7

在ANTLR 4中,您可以为此使用词法分析模式。

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

解析[字符后,词法分析器将在模式CharSet操作直到达到]字符并执行popMode命令。

+0

感谢您的洞察。设置这样的subtokenizers听起来像是一个完美的解决方案。尽管声明'只有在词法分析器语法中才允许词法模式“,我却遇到了一个错误。我可以将我的语法声明为'词法分析器语法IdPattern;',但是我不能使用分析器规则。我错过了什么? – Charles 2013-05-10 19:48:48

+1

您需要为您的词法分析器使用“词法分析器语法”,并为分析器使用单独的“分析器语法”(在单独的文件中)。 – 2013-05-10 19:51:18

+0

这是一个可以帮助他人的链接:http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle 2016-08-19 03:59:16

相关问题