Ирония: Как дать KeyTerm приоритет над переменной? - PullRequest
13 голосов
/ 11 апреля 2011

Соответствующий кусок Ирония Грамматика:

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 Ответ

2 голосов
/ 19 апреля 2011

Попробуйте изменить порядок 'tag_blk.Rule' и 'variable.Rule', так как токенизаторы обычно идут после первого совпадения, а переменная является первой в вашем списке.

...