反讽:如何将KeyTerm优先于变量?

时间:2011-04-11 01:58:23

标签: c# grammar operator-precedence lalr irony

Irony语法的相关块:

var VARIABLE = new RegexBasedTerminal("variable", @"(?-i)\$?\w+");

variable.Rule = VARIABLE;
tag_blk.Rule = html_tag_kw + attr_args_opt + block;
term_simple.Rule = NUMBER | STRING | variable | boolean | "null" | term_list;
term.Rule = term_simple | term_filter;
block.Rule = statement_list | statement | ";";
statement.Rule = tag_blk | directive_blk | term;

问题是“标签”和“变量”都可以出现在同一个地方。我希望我的解析器更喜欢变量上的标记,但它总是更喜欢变量。我怎么能改变它?

我已尝试将tag_blk.Rule更改为PreferShiftHere() + html_tag_kw + attr_args_opt + block;ImplyPrecedenceHere(-100) + html_tag_kw + attr_args_opt + block;,但它没有任何帮助。解析器甚至没有抱怨含糊不清。

1 个答案:

答案 0 :(得分:2)

尝试更改'tag_blk.Rule'和'variable.Rule'的顺序,因为令牌生成器通常在第一次匹配后进行,变量在列表中排在第一位。