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

ANTLR4上下文敏感规则:语义谓词失败时的意外解析/再同步

姚臻
2023-03-14

我正在研究一种上下文敏感的语法。下面是它的描述:

  • 它描述表达式集。
  • 每个表达式包含一个或多个由逻辑运算符分隔的部分。
  • 每个部分由可选字段标识符组成,后面跟着一些比较运算符(也是可选的)和值列表。
  • 值也用逻辑运算符分隔。
  • 默认值为字符序列。有时(取决于上下文)可以扩展每个值的可能字符集。它甚至可以使用比较运算符(根据第三条规则,用于从值列表中分离字段标识符)来将其视为值的字符。

以下是语法的简化版本:

grammar TestGrammar;

@members {
  boolean isValue = false;  
}

exprSet: (expr NL?)+;

expr: expr log_op expr
    | part
    | '(' expr ')'
    ;

part: (fieldId comp_op)? values;

fieldId: STRNG;

values: values log_op values
      | value
      | '(' values ')'
      ;

value: strng;

strng: (  STRNG 
        | {isValue}? comp_op
       )+;

log_op: '&' '&';

comp_op: '=';       


NL: '\r'? '\n';
WS: ' ' -> channel(HIDDEN);

STRNG: CHR+;
CHR: [A-Za-z];
a && b=c

strng: (  STRNG 
       // | {isValue}? comp_op
       )+;

顺便说一句,当语义谓词的计算结果为true时,结果与预期相同:strng规则匹配一组扩展的令牌:

strng: (  STRNG 
        | {!isValue}? comp_op
       )+;

请解释为什么会出现这种情况,并帮助找出正确的解决办法。谢了!

共有1个答案

戚鸿福
2023-03-14

中删除一个选项怎么样?否则,文本a&b可以是

  1. expr->exprlog_opexpr

    null
    values
         : //values log_op values
           value
         | '(' values ')'
         ;
 类似资料:
  • 我正在用这个缩放的语法解析一个类似C++的声明(删除了许多细节,使其成为一个完全可用的示例)。它不能神秘地工作(至少对我来说)。它是否与上下文相关谓词的使用有关?如果是,如何实现“计算子节点数逻辑”? 我需要实现标准的C++规则,即在下不允许超过1个。 在之前使用语义谓词似乎是解决方案。由于嵌套的是可能的,因此计数自然被声明为中的局部变量。 但是,一个不带'=0'的输入来帮助解析 分析失败,出现“

  • 我所开发的ANTR4语法。在解析字符串期间 时间;25 10 * * *;' faccalc_minus1_cron.out.'yyyyMMdd。嗯;美国/New_York 我有以下错误 表达式中的字符无效!表达式:;'无效字符:;'无关输入“;”应为{“”,整数,“-”,“/”,“,”},缺少“;”“\uu”处的时区格式不正确:faccalc\u minus1 我不理解为什么,因为正则表达式规则

  • 关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?