2013-02-12 128 views
2

我有一些麻烦理解'reportAttemptingFullContext'和'reportContextSensitivity',并在我的语法避免这些问题的一些麻烦。下面一个例子:规则与替代方法 - 如何避免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'。

谢谢你的帮助。 亲切的问候,WolfgangHämmer

回答

2

完整的上下文解析唯一的问题是潜在的性能影响(取决于需要多长时间一次以及需要多少前瞻来解决SLL冲突)。如果您的语法在SLL模式下是明确的,那么ANTLR书中描述的两阶段解析策略(使用one implementation here)将阻止对不包含语法错误的所有源文件进行全环境解析。两阶段解析总是会产生与启用了全部上下文的解析相同的最终结果,但对符合以下属性的语法+输入会获得主要的性能优势。

  1. 大部分被解析的源文件都不包含语法错误。
  2. 大多数不包含语法错误的源文件为PredictionMode.SLLPredictionMode.LL提供了相同的分析树(请参阅PredictionMode枚举)。