3

我在理解 'reportAttemptingFullContext' 和 '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”)。我该如何避免这些?我曾尝试使用语义谓词,但这只有在规则中标记的位置在代码生成时固定时才有可能(据我所知)。在以下代码中注释时(更复杂的示例):

COLUMN FORMAT FORMAT.PRICE(OBJ_CURRY(TOP.STRIKE_CURRY_ID).RD(TOP.INTR_PAY * (TOP.NOTE_RATIO * L_ALLOC)),TOP.STRIKE_CURRY_ID);

我将解析时间乘以 20;这是相当痛苦的。在这种情况下,我也会得到一个“reportAttemptingFullContext”。

我的问题:如何避免替代方案中的“reportAttemptingFullContext”。

谢谢您的帮助。亲切的问候,沃尔夫冈·哈默

4

1 回答 1

2

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

  1. 大多数被解析的源文件不包含语法错误。
  2. 大多数不包含语法错误的源文件为PredictionMode.SLLand提供相同的解析树PredictionMode.LL(请参阅PredictionMode枚举)。
于 2013-02-12T15:32:16.440 回答