2010-07-12 4 views
4

Je dois générer un analyseur de données CSV. Quelque part, j'ai réussi à écrire BNF, EBNF pour les données CSV mais je ne sais pas comment le convertir en une grammaire ANTLR (qui est un générateur d'analyseur). Par exemple, dans EBNF nous écrivons:ANTLR, comment convertir les données BNF, EBNF en ANTLR?

[{header entry}newline]newline 

mais quand j'écris ceci dans ANTLR pour générer un analyseur, il est donner une erreur et ne pas prendre entre parenthèses. Je ne suis pas expert en ANTLR, quelqu'un peut-il m'aider?

Répondre

6

Salut, je dois générer analyseur de données CSV ...

Dans la plupart des langues que je connais, il existe déjà un analyseur CSV décent 3ème partie. Donc, les chances sont que vous réinventez la roue.

Par exemple EBNF nous wrire [{entrée d'en-tête} nouvelle ligne] nouvelle ligne

L'équivalent en ANTLR ressemblerait à ceci:

((header entry)* newline)? newline 

En d'autres termes:

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

Notez que vous pouvez regrouper des règles en utilisant des parenthèses (les sous-règles sont ce qu'elles sont appelées):

'a' 'b'+ 

matches: ab, abb, abbb, ..., tandis que:

('a' 'b')+ 

matches: ab, abab, ababab, ...

+0

merci cela me va vraiment aider lors de la conversion EBNF en ANTLR – Hammad

+0

@Hammad, vous êtes les bienvenus. –

+0

salut bart, où utilisons-nous {} crochets dans ANTLR. Par exemple champ \t: (f = CITÉ \t | f = non cotées \t | // rien \t) \t {$ ligne :: fields.add (($ f == null) "": de $? f.text); } \t; – Hammad