2010-07-12 3 views
4

Мне нужно сгенерировать парсер данных CSV. Как-то мне удалось написать BNF, EBNF для CSV-данных, но я не знаю, как преобразовать это в грамматику ANTLR (которая является генератором парсера). Например, в EBNF мы пишем:ANTLR, как преобразовать данные BNF, EBNF в ANTLR?

[{header entry}newline]newline 

, но когда я пишу это в ANTLR для создания синтаксического анализатора, это дает ошибку и не принимая скобки. Я не эксперт в ANTLR, может ли кто-нибудь помочь?

ответ

6

привет, я должен генерировать парсер данных CSV ...

В большинстве языков я знаю, что уже существует приличная третьей стороной CSV парсер. Таким образом, есть вероятность, что вы изобретаете колесо.

Для примера в EBNF мы Wire, [{запись заголовка} новой строки] новой строки

Эквивалент в ANTLR будет выглядеть следующим образом:

((header entry)* newline)? newline 

Другими словами:

    | (E)BNF | ANTLR 
-----------------+--------+------ 
'a' zero or once | [a] | a? 
'a' zero or more | {a} | a* 
'a' once or more | a {a} | a+ 

Обратите внимание, что вы можете группировать правила с помощью скобок (подглавы - это то, что они называются):

'a' 'b'+ 

матчи: ab, abb, abbb, ..., в то время как:

('a' 'b')+ 

матчи: ab, abab, ababab, ...

+0

благодаря это действительно поможет мне при преобразовании EBNF в ANTLR – Hammad

+0

@ Хаммад, пожалуйста. –

+0

hi bart, где мы используем {} скобки в ANTLR. Для примера поля \t: (е = QUOTED \t | е = некотируемое \t | // ничего \t) \t {$ линии :: fields.add (($ F == NULL) "": $? f.text); } \t; – Hammad

Смежные вопросы