当前位置: 首页 > 知识库问答 >
问题:

ANTLR语法中解析器和lexer规则的调用顺序是什么?

夏侯涵映
2023-03-14

ANTLR语法中解析器和词法分析器规则的调用顺序是什么?例如,在以下语法中,输入

223

始终标识为APLHANUMERIC而不是数字

digit  : F_DIGIT+;
alpha  : APLHANUMERIC;
APLHANUMERIC   : (LOWERCASE | UPPERCASE | F_DIGIT | '_')+ ;
fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment F_DIGIT   : [0-9] ;

共有1个答案

艾焱
2023-03-14

详细说明一下评论:

标记器(又名Lexer)将始终处理您的输入流,生成一个标记流,供解析器规则在识别源结构时使用。

唯一的“调用顺序”是标记化器在解析器之前运行(这显然是必要的,因为解析器作用于解析器生成的标记)。

对于lexer规则,所有规则都在逻辑上应用于您的输入流。如果您有多个Lexer规则可以匹配输入中的下一个字符,那么就会有两个规则发挥作用。

1-如果一个Lexer规则匹配更长的字符集,那么它将用于生成标记。

2-如果输入流中有多个规则与相同数量的字符匹配,则语法中出现的第一个规则将“获胜”

片段不是lexer规则。它们只是一种方便,您可以利用它们来编写Lexer规则,以避免重复并提高可读性。

在解析器中,选择起始规则,然后解析器处理该规则的内容(递归调用组成该规则的规则及其子规则等)。唯一涉及的“顺序”是ANTLR将按顺序评估规则中的顶级备选方案,这可用于解决算术表达式中适当的运算符优先级等问题。

 类似资料:
  • 我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的” //将字符串值赋给变量 //带有字符串参数的函数 //带有特定格式(日期)的函数 下面是我语法中的相关部分

  • 我正在使用antlr4 c语法作为我自己语法的灵感。我来了一件事,我真的不明白。为什么没有使用数据类型时会有Lexer规则?例如,规则从未使用过,但分析器规则(为了简化已删除其他数据类型)使用了好几个地方。解析器规则typeSpecifier没有使用lexer规则double有什么原因吗?

  • 查看文档,ANTLR2过去有一种叫做谓词法的东西,下面的例子是这样的(灵感来自Pascal): 在我看来,这实际上是规则开头的一个积极的前瞻性断言:如果前瞻性与匹配,那么第一个规则将被应用(并与该输入的部分匹配),依此类推。 我还没有在ANTLR4中找到这样的东西。2到3迁移指南似乎没有提到这一点,而3到4更改文档指出: ANTLR3和4之间最大的区别是ANTLR4接受您给出的任何语法,除非该语法

  • 我得到了这个解析器语法,我还想用它来使用类似于Javascript模板的东西-字符串。 这个lexer语法 我不明白,为什么甚至可以匹配一些像空映射或像“world`”这样的映射,因为映射需要在中间有一个“:”。并且为什么规则模板字符串不匹配整个“Hello World”从一个滴答到另一个滴答? 编辑: 当我注意到Lexer没有被重新生成时,我得到了这样的错误:“不能为string literal

  • 在使用ANTLR3.5语法进行Java语法分析时,注意到“标识符”规则在Antlr Lexer语法中消耗了很少的关键字。Lexer语法是 当我试图解析行时: 在Antlr语法中是否有任何技巧/规定来匹配关键字本身的规则,而不影响其他功能,如“标识符”?

  • 我使用ANTLR Version4创建编译器。第一阶段是Lexer部分。我创建了“compilerlexer.g4”文件,并在其中输入了lexer规则。 compilerlexer.g4: null 有几十个这样的警告和错误。病因是什么? 一般问题:使用组合语法和单独使用lexer和parser有什么不同?如何连接单独的语法和lexer文件?