Информация об изменениях

Сообщение Re[14]: Простой скрипт внутри приложения (в виде строки) от 24.11.2021 1:56

Изменено 24.11.2021 4:59 Sinclair

Re[14]: Простой скрипт внутри приложения (в виде строки)
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>А вот для парсинга выше лексем во втором случае есть специализированный неуниверсальный алгоритм, реализация которого проще, чем написание грамматики для выражений с приоритетами, не говоря уж о заталкивании ее в реальный генератор со всеми его тараканами. Ну просто потому что эти выражения с приоритетами описываются в BNF на редкость извратно.
Эмм. А что там особенно извратного? Пишется всё примерно так же, как и слышится. Стоит один раз увидеть реализацию, как всё становится предельно очевидно. По одной продукции на приоритет:
expr = add
add = mul '+' mul | mul - mul | mul 
mul = power '*' power | power '/' power | power '%' power | power
power = atom '^' atom | atom
atom = number | var | '-' atom | '(' expr ')'
number = [0-9]+
var = [a-zA-Z][a-zA-Z0-9]*

Всё. Вот вам выражения с тремя четырьмя приоритетами, 7 операторов. Хотите, чтобы я дописал семантические действия? И сравним, что проще — Пратт или PEG.
НС>И с Праттом почему то у генераторов не очень, 99% используют ДКА для лексера и LR или LL для того что выше. Исключение составляет тот парсер что я 5 лет назад писал на предыдущей работе и, вроде бы, Nitra. С другой стороны, для Пратта генератор и не нужен особо, он там интересен только как часть полноценного LL или LR генератора, в которой есть специальный хардкод именно для выражений.
Так нам же нужны ехать, а не шашечки. PEG парсеры не нуждаются в лексерах и едят практически готовую EBNF плюс собственно семантические правила. Наверное, по быстродействию Пратт выиграет, но для однострочных выражений нам это скорее всего будет неважно.
Re[14]: Простой скрипт внутри приложения (в виде строки)
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>А вот для парсинга выше лексем во втором случае есть специализированный неуниверсальный алгоритм, реализация которого проще, чем написание грамматики для выражений с приоритетами, не говоря уж о заталкивании ее в реальный генератор со всеми его тараканами. Ну просто потому что эти выражения с приоритетами описываются в BNF на редкость извратно.
Эмм. А что там особенно извратного? Пишется всё примерно так же, как и слышится. Стоит один раз увидеть реализацию, как всё становится предельно очевидно. По одной продукции на приоритет:
expr = add
add = mul '+' mul | mul '-' mul | mul 
mul = power '*' power | power '/' power | power '%' power | power
power = atom '^' atom | atom
atom = number | var | '-' atom | '(' expr ')'
number = [0-9]+
var = [a-zA-Z][a-zA-Z0-9]*

Всё. Вот вам выражения с тремя четырьмя приоритетами, 7 операторов. Хотите, чтобы я дописал семантические действия? И сравним, что проще — Пратт или PEG.
НС>И с Праттом почему то у генераторов не очень, 99% используют ДКА для лексера и LR или LL для того что выше. Исключение составляет тот парсер что я 5 лет назад писал на предыдущей работе и, вроде бы, Nitra. С другой стороны, для Пратта генератор и не нужен особо, он там интересен только как часть полноценного LL или LR генератора, в которой есть специальный хардкод именно для выражений.
Так нам же нужны ехать, а не шашечки. PEG парсеры не нуждаются в лексерах и едят практически готовую EBNF плюс собственно семантические правила. Наверное, по быстродействию Пратт выиграет, но для однострочных выражений нам это скорее всего будет неважно.