Size: a a a

Compiler Development

2021 March 21

IK

Ivan Kochurkin in Compiler Development
Точно лексический? Если да, то можно по следующему или предыдущему токену понять, что это не вызов.
источник

IK

Ivan Kochurkin in Compiler Development
То есть равно вместо скобки
источник

AK

Andrei Kurosh in Compiler Development
Для лексического анализатора sin всегда будет просто идентификатором, но он не должен знать, что этот идентификатор обозначает.

Для синтаксического анализатора, если мы говорим о корректно составленной грамматике без неоднозначностей, будет понятно что после var идет имя новой переменной, а не выражение (частным случаем которого является вызов метода).

Для семантического анализатора все уже сложнее. Если до него доходит выражение вида a = sin, то тут может быть несколько толкований:

1. Есть переменная sin, имеется в виду она
2. Есть поле класса sin, имеется в виду оно (короткая запись this.sin)
3. Имеется в виду функция, которая сохраняется в переменную

Тут все зависит только от вашей фантазии и желаемой семантики - можно решать приоритетами, можно кидать ошибку, можно запрещать такие конфликты конвенциями
источник

РС

Роман Соловьев... in Compiler Development
Andrei Kurosh
Для лексического анализатора sin всегда будет просто идентификатором, но он не должен знать, что этот идентификатор обозначает.

Для синтаксического анализатора, если мы говорим о корректно составленной грамматике без неоднозначностей, будет понятно что после var идет имя новой переменной, а не выражение (частным случаем которого является вызов метода).

Для семантического анализатора все уже сложнее. Если до него доходит выражение вида a = sin, то тут может быть несколько толкований:

1. Есть переменная sin, имеется в виду она
2. Есть поле класса sin, имеется в виду оно (короткая запись this.sin)
3. Имеется в виду функция, которая сохраняется в переменную

Тут все зависит только от вашей фантазии и желаемой семантики - можно решать приоритетами, можно кидать ошибку, можно запрещать такие конфликты конвенциями
Т.е. для лексического анализатора это все просто идентификаторы?

А какие типы токенов тогда различает лексический анализатор
источник

AK

Andrei Kurosh in Compiler Development
Роман Соловьев
Т.е. для лексического анализатора это все просто идентификаторы?

А какие типы токенов тогда различает лексический анализатор
Если провести аналогию с обычным языком, то лексический анализатор различает буквы, синтаксический складывает их в слова, а семантический - слова в концепции
источник

AK

Andrei Kurosh in Compiler Development
Типы токенов - числа, строки, ключевые слова, операторы... зависит от языка
источник

РС

Роман Соловьев... in Compiler Development
Andrei Kurosh
Типы токенов - числа, строки, ключевые слова, операторы... зависит от языка
Ну вот я как раз и сделал несколько типов, среди которых есть операторы и есть идентификаторы. И вот столкнулся с неоднозначностью по поводу Sin
источник

РС

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

K

Kir in Compiler Development
Роман Соловьев
А операторы и ключевые слова это одно и тоже для лексического анализатора?
А это как реализовать! Если набор операторов прибит к языку, то да. А если как в хаскелле, можно свои объявлять (и далать операторы из функций) - это отдельный вид токена.
источник

РС

Роман Соловьев... in Compiler Development
Kir
А это как реализовать! Если набор операторов прибит к языку, то да. А если как в хаскелле, можно свои объявлять (и далать операторы из функций) - это отдельный вид токена.
А в целом лексический анализатор работает по таблице переходов или проверяет все шаблоны, возвращая первое совпадение?
источник

K

Kir in Compiler Development
Роман Соловьев
А в целом лексический анализатор работает по таблице переходов или проверяет все шаблоны, возвращая первое совпадение?
Обычно на регулярках делают, распознавание токенов-то
источник

YS

Yaroslav Schekin in Compiler Development
Роман Соловьев
А в целом лексический анализатор работает по таблице переходов или проверяет все шаблоны, возвращая первое совпадение?
Это один из вариантов, да.
Но даже при реализации такого варианта обычно используется longest leftmost.
Т.е. таблица переходов автомата строится таким образом.
источник

РС

Роман Соловьев... in Compiler Development
Yaroslav Schekin
Это один из вариантов, да.
Но даже при реализации такого варианта обычно используется longest leftmost.
Т.е. таблица переходов автомата строится таким образом.
спасибо, находил только про то, что самый длинный надо брать, а тут целый ряд правил)
источник

YS

Yaroslav Schekin in Compiler Development
Роман Соловьев
спасибо, находил только про то, что самый длинный надо брать, а тут целый ряд правил)
Хмм... так это одно правило, нет?
источник

РС

Роман Соловьев... in Compiler Development
Kir
Обычно на регулярках делают, распознавание токенов-то
Я на регулярках и сделал, тогда все таки вопрос как отличить ключевые слова/идентификатор/оператор друг от друга, если это разные типы токенов)
источник

РС

Роман Соловьев... in Compiler Development
Yaroslav Schekin
Хмм... так это одно правило, нет?
источник

YS

Yaroslav Schekin in Compiler Development
Это "разжёвывание" этого одного правила (и пункты 3-6 вообще не относятся к lexer). ;)

> вопрос как отличить ключевые слова/идентификатор/оператор друг от друга

Хмм... в смысле? В чём конкретная проблема?
источник

РС

Роман Соловьев... in Compiler Development
Yaroslav Schekin
Это "разжёвывание" этого одного правила (и пункты 3-6 вообще не относятся к lexer). ;)

> вопрос как отличить ключевые слова/идентификатор/оператор друг от друга

Хмм... в смысле? В чём конкретная проблема?
У меня есть оператор Sin и это может быть идентификатором. Не ясно какой тип токена должен присвоить лексический анализатор
источник

YS

Yaroslav Schekin in Compiler Development
Роман Соловьев
У меня есть оператор Sin и это может быть идентификатором. Не ясно какой тип токена должен присвоить лексический анализатор
При "классическом" подходе к lexing ответ такой: Sin не может быть идентификатором, т.е. тип token-а — оператор, соответственно.
источник

РС

Роман Соловьев... in Compiler Development
Yaroslav Schekin
При "классическом" подходе к lexing ответ такой: Sin не может быть идентификатором, т.е. тип token-а — оператор, соответственно.
хотел спросить про регистр зависимые случаи, но понял что как раз в этом случае все однозначно. А у меня как раз этот случай, спасибо!:)

проблема накапливалась из-за того, что я как раз  Leftmost Longest не учитывал
источник