当前位置: 首页 > 编程笔记 >

ANTLR 优先规则

刘和正
2023-03-14
本文向大家介绍ANTLR 优先规则,包括了ANTLR 优先规则的使用技巧和注意事项,需要的朋友参考一下

示例

几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下:

  • 首先,选择与最长输入匹配的词法分析器规则

  • 如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则

  • 如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择一个

以下是组合语法:

grammar LexerPriorityRulesExample;

// 解析器规则

randomParserRule: 'foo'; // 隐式声明的令牌类型
    
// Lexer规则
    
BAR: 'bar';
IDENTIFIER: [A-Za-z]+;
BAZ: 'baz';

WS: [ \t\r\n]+ -> skip;

给出以下输入:

aaa foo bar baz barz

将从词法分析器生成以下令牌序列:

IDENTIFIER 'foo' BAR IDENTIFIER IDENTIFIER

  • aaa 是类型 IDENTIFIER

    只有IDENTIFIER规则可以匹配此令牌,没有歧义。

  • foo 是类型 'foo'

    解析器规则randomParserRule引入了隐式'foo'令牌类型,该类型比IDENTIFIER规则优先。

  • bar 是类型 BAR

    该文本与在BAR规则之前定义的IDENTIFIER规则匹配,因此具有优先权。

  • baz 是类型 IDENTIFIER

    该文本与BAZ规则匹配,但也与IDENTIFIER规则匹配。后者是按之前 定义的那样选择的BAR。

    给定语法,BAZ它将永远无法匹配,因为该IDENTIFIER规则已经涵盖了所有BAZ可以匹配的内容。

  • barz 是类型 IDENTIFIER

    该BAR规则可以匹配此字符串(bar)的前3个字符,但是该IDENTIFIER规则将匹配4个字符。当IDENTIFIER匹配更长的子字符串时,将选择BAR。

根据经验,应更通用的规则之前定义特定的规则。如果规则只能匹配先前定义的规则已覆盖的输入,则将永远不会使用该规则。

隐式定义的规则(例如)的'foo'行为就像所有其他词法分析器规则之前定义的一样

 类似资料:
  • 我有一个巨大的ANTLR语法,我面临着一个小问题。语法有两个规则expr和set,定义如下: 这里的问题是,对于一组形式*s1*s2,应该减少如下: 然后RHS中的每一组应减少到: 但相反,它们正在减少: 因为forn的集合被解析为,而不是。 set的规则之一,将其简化为exr。语法中还有许多其他类似的规则也简化为exr。这里出现的问题是因为set和exr中的一些规则是相似的。但是因为有些规则不同

  • 本文向大家介绍ANTLR 简单规则,包括了ANTLR 简单规则的使用技巧和注意事项,需要的朋友参考一下 示例 Lexer规则定义令牌类型。它们的名称必须以大写字母开头,以区别于解析器规则。 基本语法: 语法 含义 A 匹配名称为lexer的规则或片段 A A B 比赛A之后B (A|B) 匹配A或B 'text' 匹配文字“文本” A? 匹配A零或一次 A* 匹配A零次或多次 A+ 匹配A一次或多

  • 我有以下案文: 在第一步中,下面的映射是tacking place: JAPE规则: 我不明白为什么-rule是匹配的,而不是。

  • 这是我的语法文件: https://github.com/frankdu/minijs/blob/master/antlr/src/main/resources/org/minijs/parser/antlr/javascript.g4 问题在于语句解析。当它看到break语句时 https://github.com/frankdu/minijs/blob/master/core/src/test

  • 本文向大家介绍ANTLR 隐式词法规则,包括了ANTLR 隐式词法规则的使用技巧和注意事项,需要的朋友参考一下 示例 当'{'在解析器规则中使用like标记时,将为它们创建隐式词法分析器规则,除非存在显式规则。 换句话说,如果您有词法分析器规则: 然后,这两个解析器规则都是等效的: 但是,如果OPEN_BRACE是词法规则没有定义,一个隐含的匿名规则将被创建。在这种情况下,隐含的规则将被定义为,如

  • 我是ANTLR4的新手,我试图解析此输入 在这个输入中,A应该是一个函数调用,而B应该是一个名为B的变量。但我在lexer中有一个跳过空格的规则。 如何为此输入编写解析器规则,但保留跳过空格的规则 提前感谢