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

ANTLR:为什么无效输入可以匹配语法定义

段干玺
2023-03-14

我为计算表达式编写了一个非常简单的语法定义:

grammar SimpleCalc;

options {
    output=AST;
}

tokens {
    PLUS  = '+' ;
    MINUS = '-' ;
    MULT = '*' ;
    DIV = '/' ;
}

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

ID  : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { Skip(); } ;

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

start: expr EOF;

expr : multExpr ((PLUS | MINUS)^ multExpr)*;

multExpr : atom ((MULT | DIV)^ atom )*;

atom : ID
     | '(' expr ')' -> expr;

我尝试了无效表达式abc&*defbystart,但它通过了。看起来&字符被忽略了。这里有什么问题?

共有1个答案

臧增
2023-03-14

实际上,您的无效表达式abc&=def没有被传递;它会导致NoviableAltException

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

  • 我正在尝试将下面的文本与ANTLR语法匹配: ANTLR语法是: 我得到的错误是: 我猜语法是合理的,但为什么会出现错误呢? null 要匹配的文档: 语法1: 在语法1中,跳过了T1,但不跳过T2中的T1部分。T2将在lexer阶段匹配输入文本。(即使我们把T2放在T1之后,T2还是会匹配的。我认为ANTLR为了最长的令牌做了一些贪婪的匹配。) 因此,正如@macmoonshine所说,我确实必

  • 我已经开始使用ANTLR,并注意到它的lexer规则非常易变。一个极其令人沮丧的例子如下: 此语法不会匹配以下内容: c: \测试。txt x 奇怪的是,如果我将更改为这次它仍然失败,给出一条错误消息说“不匹配的输入'x'期待'x'”,这非常令人困惑。更奇怪的是,如果我将中的用法替换为,整个事情都可以正常工作(尽管会比我希望匹配的更多,所以一般来说,它对我来说不是一个有效的解决方案)。 我非常困惑

  • 编辑:当我使用ANTLRWorks以相同的语法输入时,会抛出一个NoViableAltException。我如何通过代码得到错误?

  • 到目前为止,我有这个: 和这个: 当我测试这个时,它不能采取双倍数字,我收到这个消息: 我该如何解决这个问题?

  • 问题内容: 作为一个初学者,当我从《权威的ANTLR 4参考》一书中学习ANTLR4时,我尝试从第7章运行修改后的练习版本: 由于Java属性只是键值对,因此我用来匹配eveything除外(我不希望它仅支持双引号中的字符串)。运行以下句子时,我得到: 当我改用它时,它可以工作。 我想知道我错在哪里,以便将来避免类似的错误。 请给我一些建议,谢谢! 问题答案: 由于ID和STRING都可以匹配以“