【发布时间】:2016-07-27 15:32:20
【问题描述】:
我有一个语法(如果你稍微简化一下的话)看起来像这样:
options
{
backtrack=true;
}
// parser
text: (TEXT)+;
and_level2_thing: text | '(' and_thing ')';
and_thing: and_level2_thing (OP_AND and_level2_thing)*;
and_expression: and_thing (OP_AND and_thing)*;
parse_starts_here: and_expression EOF;
// lexer
OP_AND : 'AND';
TEXT : ( '"' (~'"')* '"' );
它有两种类型的表达式组顶级 (and_thing) 和内部级别 (and_level2_thing),它们适用不同的规则,但两个级别都必须支持 AND,例如TOP_TYPE_EXPRESSION AND TOP_TYPE_EXPRESSION 和
TOP_TYPE_EXPRESSION AND (INNER_TYPE_EXPRESSION AND INNER_TYPE_EXPRESSION).
当我有一个表单的值时:
(TOP_TYPE_EXPRESSION AND (TOP_TYPE_EXPRESSION AND (TOP_TYPE_EXPRESSION AND (TOP_TYPE_EXPRESSION))))
时间开始在嵌套级别上呈指数增长,大概是因为 AND 不明确。这个表达式立即计算:
TOP_TYPE_EXPRESSION AND TOP_TYPE_EXPRESSION AND TOP_TYPE_EXPRESSION AND TOP_TYPE_EXPRESSION
如果你说这不是一种设计良好的语言 - 我完全同意,但这就是我现在所拥有的 :)。任何想法如何避免这个问题?
【问题讨论】:
标签: compiler-construction antlr antlr3