Bonjour,
Je débute avec Antlr et je rencontre un problème plutôt gênant.
J'ai écris une grammaire:
L'idée étant de pouvoir écrire des choses comme: "FEDERATION = 1 AND IsSigned".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 grammar Antlr_HEHE; options { language=CSharp2; } @parser::namespace { CDM.SD.HEHE.Shared.HEHE } @lexer::namespace { CDM.SD.HEHE.Shared.HEHE } OP_NOT : 'NOT'; OP_1 : 'OR'; OP_2 : 'AND'; OP_3 : '!='|'<='|'>='|'<'|'>'|'='; BROPEN : '('; BRCLOSE : ')'; NUMBER : ('0'..'9')+ ('.' ('0'..'9')+)?; ISSIGNED : 'isSigned'; FEDERATION : 'Federation'; MEDIA : 'Media'; STRING : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')+; prog : instr_2 (OP_1 instr_2)* EOF { System.out.println("INT .. INT"); }; instr_2 : instr_3 (OP_2 instr_3)*; instr_3 : atom (OP_3 atom )?; atom : OP_NOT? (ISSIGNED | FEDERATION | MEDIA | NUMBER | STRING | (BROPEN prog BRCLOSE));
Ensuite le code c# doit pouvoir exécuter l'opération. Il va remplacer FEDERATION par le numéro courant, remplacer la valeur de isSigned et executer le tout. En gros:
La grammaire compile bien et j'ai bien le lexer et le parser qui est généré. Seulement je n'arrive pas à l'utiliser dans mon code.return getFederation() == 1 && isSigned().
Je ne sais pas quoi faire ensuite avec le parser. J'ai trouvé plusieurs exemples sur internet mais aucun n'est utilisable. Ils utilisent des méthodes dans l'objet parser que je n'ai pas. Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Antlr_HEHELexer lex = new Antlr_HEHELexer(new ANTLRStringStream("FEDERATION = 1 AND IsSigned")); CommonTokenStream tokens = new CommonTokenStream(lex); Antlr_HEHEParser parser = new Antlr_HEHEParser(tokens);
Quelqu'un aurait une idée de comment je dois utiliser le code C# générer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Antlr_HEHEParser.expr_return ret = parser.expr(); //je n'ai ni la classe expr_return, no la méthode expr().
Partager