Re[2]: PEG-парсер
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.03.10 19:02
Оценка:
Здравствуйте, para, Вы писали:

P>
P>    protected override DoGenerateResult(symbols : list[int], ruleName : string) : int
P>    {
P>    | (_, "expr2") =>
P>         symbols.Nth(0)
P>...


Здорово, что что-то работает, но выглядит это не так как хотелось бы. Этот DoGenerateResult какой-то не внятный.
Все же хотелось бы видеть вызовы именованных правил и не видеть обработки строк и этих symbols.

P>решается с неверно.

P>порядок вызова обработчиков таков:
P>...
P>5. 5/-1 = -5
P>6. 4-5 = -1 !!!!!!!!! вычитание и сложение у меня идёт справа налево а надо на оборот.

Это проблема с ассоциативностью. Они могут быть вызваны грамматикой. Чтобы их ловить лучше всего выводить собщения о начале и окончании парсинга правил. Лучше всего при этом отбивать вложенные првила пробелом.

Возможно для начала лучше взять грамматику с циклами. В ней ассоциативность будет зависить от того как работают семантические правила. Так что лучше отлаживайся вот на такой грамматике:
any                    = ['\u0000'..'\uFFFF'];
digit                  = ['0'..'9'];
spaces                 = ' '*;
num             : Expr = digit+ spaces;
unaryMinus      : Expr = '-' spaces simplExpr;
parenthesesExpr : Expr = '(' spaces sumOrSub ')' spaces;
simplExpr       : Expr = num / parenthesesExpr / unaryMinus;
mulOrDiv        : Expr = simplExpr (('*' / '/') spaces simplExpr)*;
sumOrSub        : Expr = mulOrDiv  (('+' / '-') spaces mulOrDiv )*;
start           : Expr = spaces sumOrSub !any;


В ней ассоциативность будет зависеть только от реализации обработчиков для правил mulOrDiv и sumOrSub.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.