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

为什么在这种情况下,空格对antlr4很重要?

酆耀
2023-03-14

假设我有这个语法,用Antlr4编写:

grammar Test;
start : expr* ;

expr : expr '-' expr
    | INT ;

MINUS : '-' ;
INT: MINUS? DIGIT+ ; // Disclaimer: this definition of an integer is just for illustration purposes

DIGIT : '0'..'9' ;

WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

我的思维过程是1-1应该与1-1相同;应该是expr'-'expr。如果1-1

      start
      expr(-)

expr(1)     expr(1)

上面的树似乎是正确的,它再次计算为expr'-'expr

但是当不使用空格时,antlr认为有两个INT-expr。如果1-1

       start
expr(1)     expr(-1)

不应该跳过所有空格(使用WS规则),这意味着两个表达式的解析方式应该相同吗?

共有1个答案

彭展
2023-03-14

Lexer规则匹配尽可能多的字符,因此-1被标记为INT-1(不带空格)作为s singleINT

您必须意识到,lexer不会监听解析器。如果解析器尝试为输入1-1匹配标记INT减去INT,lexer不会生成这些标记。因为lexer匹配尽可能多的字符,所以它总是为该输入创建两个INT标记(no减号!)。解析和标记化是两个独立的步骤。

 类似资料:
  • 我用干净的架构在android项目上工作。 我有以下课程: 使用public dispose()方法从onNext实现中释放序列。 但我还是不明白使用它的好处。是否用于在销毁视图时从observable取消订阅,以便从转到并关闭发射器上的订阅?

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 我的SSE代码和标准的C代码一样慢,我做错了什么? 我在Intel i3-6100 CPU上运行,使用C和minGW和CLion,我使用-O0标志。 在使用clock()函数测量性能时,两个版本的速度一样快,都达到了大约45节拍(超过1000节拍)(SSE:1138节拍-C:1093节拍)。我认为SSE不知何故打乱了时钟()的时间测量,但即使只是简单地计算秒,也没有什么不同。 函数 :(交换注释.

  • 问题内容: 来自问题的原因,或者说更确切地说,object .__new__在这两种情况下的工作方式不同 作者对为什么不感兴趣,而对如何感兴趣。 我非常想了解原因,尤其是: 为什么不打印任何参数而不是 为什么没有为testclass3引发错误?(因为除了自我之外没有其他参数) 码 问题答案: 您正在使用旧的Python版本;此错误消息已更新: Python只会抱怨既不支持又不被覆盖的参数。例如,当