Как разобрать ключевое слово, которое также является оператором - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь проанализировать следующий код, используя parsec

for x = Int in [1, 2, 3]
    print x + 1

Единственная часть примера, которая может быть трудна для понимания, это x = Int, что означает, что переменная x определена как Int.Синтаксически Int здесь есть выражение.С тем же успехом его можно заменить вызовом функции, который возвращает тип.

До сих пор я был в состоянии проанализировать все простые литералы и операторы.Моя проблема сейчас в том, что на этом языке in является ключевым словом, а также оператором, а типы (Int) являются объектами, как и любые другие (которые могут быть списками in).Например, следующий код совершенно корректен и печатает false

print (Int in [1, 2, 3])

Так что сейчас мой анализатор правильно анализирует for x =, а затем анализирует Int in [1, 2, 3] как ОДНО выражение.Как я могу заставить синтаксический анализатор for захватить in вместо того, чтобы оставить его анализатору expression?У меня такое ощущение, что в parsec есть что-то подобное, но я не знаю, как его найти.

Редактировать: Я изменил пример, чтобы придать ему больше смысла ...

Редактировать: У меня возникают трудности в разных местах, язык очень сложный.Другой пример - оператор else, который возвращает свой второй аргумент, если его первый аргумент равен нулю:

print (if true then (null else "hello") else "world")
# >> hello
print (if true then null else "hello" else "world")
# >> world

1 Ответ

0 голосов
/ 31 декабря 2018

Большое спасибо @talex и @nm за то, что указали мне, куда я должен был смотреть.Вот как я решил эту конкретную проблему:

Я параметризовал синтаксический анализатор expression (должен был включить {-# LANGUAGE FlexibleContexts #-}) со списком слов «извлечения» и одинаково для каждого соответствующего синтаксического анализатора под ним, в частности, binOperator parser

 expression :: [String] -> MyParser AST 

 binOperator :: [String] -> MyParser AST

Если в позиции двоичного оператора встречается одно из слов «eject», синтаксический анализатор binOperator завершается неудачно (и с анализатором на основе chainl1, который читает двоичные операции)оставляя слово «извлечение» (в данном случае in) парсеру for для использования.Это должно работать так же хорошо с парсером if.

И я просто не передаю слова извлечения парсеру paren, поэтому между ( и ) не распознаются слова извлечения.(и подобные парсеры как список).

...