2015-02-12 4 views
2

Я пишу DSL и изучаю parboiled2 в то же время. Когда мой AST построен, я хотел бы запустить некоторые семантические проверки и, если есть какие-либо ошибки, выводит сообщения об ошибках, которые ссылаются на оскорбительные позиции в исходном тексте.Parboiled2: ссылка на позицию в исходном тексте от AST

Я пишу такие вещи, как следующий, который до сих пор, сделать работу:

case class CtxElem[A](start:Int, end:Int, elem:A) 

def Identifier = rule { 
    push(cursor) ~ 
    capture(Alpha ~ zeroOrMore(AlphaNum)) ~ 
    push(cursor) ~ 
    WhiteSpace 
    ~> ((start, identifier, finish) => CtxElem(start, finish, identifier)) 
} 

Есть ли лучше или более простой способ?

+0

Выглядит хорошо. Я бы предпочел избежать «финиша». Вероятно, вы можете заменить его прямым вызовом на курсор в этой позиции, не проходя через стек. –

ответ

0

Parboiled 2 (пока) doesn't support parser recovery strategies. Это означает, что если синтаксический анализатор завершится неудачей - он остановится. Насколько я помню, он должен печатать символ, где он не удался, или, по крайней мере, вы могли получить cursor

Итак, если вы пытаетесь создать свой собственный DSL и вам нужна такая функциональность, я бы предложил вам используйте другой инструмент, например ANTLR. Parboiled1 поддерживает методы восстановления парсеров, но пока он мертв в похоронах, если пользуется поддержкой второй версии. Parboiled 2 хорош в анализе файлов журналов или файлов конфигурации (которые должны исправляться по умолчанию), но это не хорошо для создания DSL.

+0

Мне это нужно для обнаружения семантических ошибок в синтаксически правильном вводе, и это сработало. Восстановление ошибки синтаксиса было моим следующим препятствием, поэтому я попробовал ANTLR (версия JS), но исключения из null-указателей, которые я получил, были разочаровывающими. Я закончил ручное кодирование рекурсивного парсера спуска, с восстановлением ошибок, и я очень доволен результатом. – Eduardo