Antlr4 具有备选方案的规则集-如何避免reportAttemptingFullContext和reportContextSensitivity

Antlr4 具有备选方案的规则集-如何避免reportAttemptingFullContext和reportContextSensitivity,antlr4,Antlr4,我在理解“ReportAttentingFullContext”和“reportContextSensitivity”时遇到了一些困难,在语法中避免出现论文时也遇到了一些困难。这里有一个例子: IF L_COUNT > 0 THEN LINEFEED; END IF; 下面是我的语法摘录: if_statement : IF plsql_condition THEN seq_of_statements? elsif_statement* else_statement? E

我在理解“ReportAttentingFullContext”和“reportContextSensitivity”时遇到了一些困难,在语法中避免出现论文时也遇到了一些困难。这里有一个例子:

IF L_COUNT > 0 THEN
    LINEFEED;
END IF;
下面是我的语法摘录:

if_statement
:   
IF plsql_condition THEN 
seq_of_statements? elsif_statement* else_statement? END IF
;

plsql_condition
    :   expr_bool
    ;

expr_bool
:
expr_or (OR expr_or)*
;

expr_or
:
expr_and (AND expr_and)*
;

expr_and
:
NOT? expr_not
;

expr_not
:
expr_not_is |
expr_not_between |
expr_not_in |
expr_not_op |
expr_add
;
以及错误消息:

line 1:13 TIME: 2013-02-12 09:15:52.225, reportAttemptingFullContext d=116, rule='expr_not', input='L_COUNT > 0'
line 1:11 TIME: 2013-02-12 09:15:52.228,reportContextSensitivity d=116, rule='expr_not', input='L_COUNT >'
line 1:11 TIME: 2013-02-12 09:15:52.354, reportAttemptingFullContext d=120, rule='expr_not_op', input='>'
line 1:11 TIME: 2013-02-12 09:15:52.355,reportContextSensitivity d=120, rule='expr_not_op', input='>'
语法作为一个整体是相当大的。这是一个简单的例子。基本上,每当我有其他选择时,我都会遇到一个问题(如上面的“expr_not”所述)。我该如何避免这些?我尝试过使用语义谓词,但这只有在代码生成时标记在规则中的位置固定时才可能(据我所知)。在以下代码中进行注释时(更复杂的示例):

我将解析时间乘以20;这是相当痛苦的。在本例中,我还得到一个“reportAttemptingFullContext”

我的问题: 如何避免备选方案中的“reportAttemptingFullContext”

谢谢你的帮助。
您好,Wolfgang Hämmer

完整上下文解析的唯一问题是潜在的性能影响(取决于解决SLL冲突所需的频率和前瞻性)。如果您的语法在SLL模式下是明确的,那么ANTLR手册(with)中描述的两阶段解析策略将阻止对所有不包含语法错误的源文件进行完全上下文解析。两阶段解析总是产生与启用完整上下文的解析相同的最终结果,但对于满足以下属性的语法+输入,它会获得主要的性能优势

  • 正在分析的大多数源文件不包含语法错误
  • 大多数不包含语法错误的源文件为
    PredictionMode.SLL
    PredictionMode.LL
    提供了相同的解析树(请参见枚举)
  • COLUMN FORMAT FORMAT.PRICE(OBJ_CURRY(TOP.STRIKE_CURRY_ID).RD(TOP.INTR_PAY * (TOP.NOTE_RATIO * L_ALLOC)),TOP.STRIKE_CURRY_ID);