java - 了解 ANTLR4 中的词法分析器规则解析

标签 java antlr4 lexer

我正在阅读 ANTLR4 防御指南,现在正在阅读有关词法分析器规则解析的部分。以下是本节的内容:

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

Rule ID could also match kewords such as enum or for, which means there's more than one rule that could match the same string. [...] Literals such as 'enum' become lexical rules and go immediately after the parser rules but before the explicit lexical rules.

这是什么意思以及它如何帮助我们解决潜在的歧义?我会说这样的声明

ENUM_KEYWORD: 'enum'

其中ATNLR4可能在内部使用将在规则 enumDef: 'enum' '{' ... '} 之后立即贴上标签看起来如下:

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

这正是 ANTLR4 的工作方式吗?

最佳答案

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

因此,如果您有词法分析器规则:

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

根据其顺序,输入“for”将被标记为 FOR token 或 ID token ,因为对于两者来说它都是正确的。

因此,语法经常包含“模糊”规则,其中所有关键字都被提及,因此当另一个标记包含关键字时它会通过。

例如:

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

这样如果有 alfaNum token “选择”,它就会通过。如果未指定 ambigous,则会故障转移词法分析器规则 SELECT: 'select';

关于java - 了解 ANTLR4 中的词法分析器规则解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35765870/

相关文章:

c++ - 使用 C++11 正则表达式捕获上下文无关语法文件的内容

java - 如何使用java定义Excel工作表的动态单元格范围?

java - 如何在java中调用抽象类方法给另一个类

java - ANTLR 4 和 AST 访问者

java - 强制 ANTLR 仅读取输入文件中的第一个注释部分并跳过其余注释

java - 有没有办法轻松修改 ANTLR4 的错误消息?

c++ - 词法分析器不断跳过最终标记

java - 确定字符出现的次数,无论大小写

java - Spring Data REST端点消失( hibernate 冲突)

php - 是否有 Javascript 词法分析器/分词器(在 PHP 中)?