Как я могу определить, является ли вызов функции выражением или оператором при написании синтаксического анализатора для языка, похожего на Lua - PullRequest
2 голосов
/ 12 ноября 2010

Я пытаюсь написать парсер для Lua-подобного языка, используя lex и yacc.Это язык без принудительного завершения оператора (точка с запятой), и эта функция не позволила мне определить, является ли вызов функции оператором или выражением.
Например, следующая функция:

function foo()  
  return { x = 5 }  
end  

вернет таблицу.Вот некоторые примеры использования:

foo()  -- this is a statement
t = foo()  -- foo is an expression
a = foo().x  -- foo() is a prefix-expression
print(foo())  -- foo() is an expression

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

Большое спасибо.

1 Ответ

1 голос
/ 12 ноября 2010

У меня была похожая задача, которую нужно было решить при реализации парсера T-SQL.В итоге я включил ;, как если бы он был обязательным в грамматике, и при синтаксических ошибках я вставил бы виртуальный токен ;, чтобы завершить текущий оператор, и затем парсер повторил сокращение.Для моего варианта использования это работает очень хорошо, может быть, это также может работать для вашего.

...