Size: a a a

Compiler Development

2021 May 24

K

Kir in Compiler Development
https://hackage.haskell.org/package/parsec - любые парсеркомбинаторы можно рассматривать как LL(*), только заданные не в форме таблиц
источник

K

Kir in Compiler Development
LR всё равно мощнее)
источник

РС

Роман Соловьев... in Compiler Development
Видел целую пейпу о том, что он сложнее и для EBNF его написать это целая пытка:)
источник

h

hazer_hazer in Compiler Development
ну. если типы предикатов в диапозоне однозначны и не конфликтуют с другими ветками парсинга, то проблем не вижу. А вот если от кол-ва предикатов зависит ветвление, то сомневаюсь, что LL(1) такое получиться без заморочек спарсить
источник

K

Kir in Compiler Development
А его не надо писать для EBNF, надо для BNF и транслятор EBNF->BNF
источник

K

Kir in Compiler Development
Второе я тоже писал, кстати
источник

h

hazer_hazer in Compiler Development
@gmike_music, а можете привести пример проблемы?
источник

РС

Роман Соловьев... in Compiler Development
А как это транслировать если там например A{3,} - а может повторяться от 3 до бесконечного количества раз
источник

K

Kir in Compiler Development
Как aaa(a*), очевидно. А устранение *, +, ? и | есть в коде у меня:

https://github.com/Heimdell/LR/blob/master/src/Typed.hs
источник

K

Kir in Compiler Development
для a+ создаётся новое правило a_plus = a a_plus | a
источник

РС

Роман Соловьев... in Compiler Development
По определению LL после того как мы определили нужное правило, мы должны удалить элемент из стека. А в данном случае мы его не удаляем, а инкремитируем счётчик повторений, чтобы потом сравнить с диапазоном?
источник

K

Kir in Compiler Development
Для врождений a? - дублируется исходное
a = b? c ->
a = b c
a = c
источник

h

hazer_hazer in Compiler Development
А есть closing и opening delimeter'ы?
источник

РС

Роман Соловьев... in Compiler Development
Кстати, это какой-то другой вид грамматики? В BNF, EBNF не терминал определяется один раз, т.е. там не пишут

A= B
A= $
источник

РС

Роман Соловьев... in Compiler Development
А что имеется в виду?) Нигде не видел их упоминания)
источник

K

Kir in Compiler Development
Это форма грамматики, которую я использую, чтобы не писать |.

a = b? c

=>
a = b c | c
источник

h

hazer_hazer in Compiler Development
сразу скажу, что я просто не шарю за парсер-генераторы. поэтому термины их мне неизвестны.
я только самописные делал под определенные синтаксисы.

имею в виду, что если у вас начинается последовательность, у которой, к примеру, есть определяющий начальный токен ( и закрывающий ), то вы парсите элементы до конца файла, пока не найдете закрывающий ). наверное такое себе решение...
источник

РС

Роман Соловьев... in Compiler Development
Это как раз First и Follow. Они есть, да
источник

h

hazer_hazer in Compiler Development
тогда в чем проблема?
источник

h

hazer_hazer in Compiler Development
skip First
while not EOF
   if Follow: break
   // Parse element...
skip Follow
источник