Использование LPEG (грамматики выражений Lua Parser), например boost :: spirit - PullRequest
6 голосов
/ 01 ноября 2011

Так что я играю с lpeg, чтобы заменить грамматику boost spirit, я должен сказать, что boost :: spirit гораздо более элегантный и естественный, чем lpeg. Однако работать с этим из-за ограничений современной технологии компилятора C ++ и проблем TMP в C ++ довольно сложно. Механизм типов в этом случае является вашим врагом, а не вашим другом. Lpeg, с другой стороны, в то время как уродливый и базовый результат повышает производительность.

Во всяком случае, я отвлекся, часть моей грамматики lpeg выглядит следующим образом:

function get_namespace_parser()
  local P, R, S, C, V =
    lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.V

namespace_parser = 
lpeg.P{
    "NAMESPACE";
    NAMESPACE   = V("WS") * P("namespace") * V("SPACE_WS") * V("NAMESPACE_IDENTIFIER") 
                  * V("WS") * V("NAMESPACE_BODY") * V("WS"),

    NAMESPACE_IDENTIFIER = V("IDENTIFIER") / print_string ,
    NAMESPACE_BODY =  "{" * V("WS") *   
                      V("ENTRIES")^0 * V("WS") * "}",


    WS = S(" \t\n")^0,
    SPACE_WS = P(" ") * V("WS") 
}
  return namespace_parser
end 

Эта грамматика (хотя и неполная) соответствует следующему namespace foo {}. Я хотел бы получить следующую семантику (которая является распространенным вариантом использования при использовании Boost Spirit).

  1. Создать локальную переменную для правила пространства имен.
  2. Добавить структуру данных пространства имен к этой локальной переменной, когда namespace IDENTIFIER { сопоставлено.
  3. Передать вновь созданную структуру данных пространства имен в NAMESPACE_BODY для дальнейшего построения AST ... и т. Д. И т. П.

Я уверен, что этот вариант использования достижим. Нет примеров, показывающих это. Я недостаточно знаю язык или библиотеку, чтобы понять, как это сделать. Может кто-то показать синтаксис для этого.

edit: После нескольких дней попыток потанцевать с lpeg и надеть ноги, я решил вернуться к духу: D ясно, что lpeg предназначен для плетения с Функции lua и то, что такое плетение имеет очень свободную форму (в то время как дух имеет четкую, очень хорошо документированную семантику). У меня просто пока нет правильной ментальной модели Луа.

...