2009-12-02 15 views
7

J'essayais de faire en sorte que ANTLR 3.2 génère un parser/lexer en C++. C'était infructueux. Les choses se sont bien passées avec Java & C cependant.La génération de code C++ dans ANTLR 3.2 est-elle prête?

j'utilisais ce tutoriel pour commencer: http://www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.html

Quand je vérifié les fichiers * .STG, je trouve que:

CPP a seulement

./tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg 

C a tant de fichiers :

./tool/src/main/resources/org/antlr/codegen/templates/C/AST.stg 
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTDbg.stg 
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTParser.stg 
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTTreeParser.stg 
./tool/src/main/resources/org/antlr/codegen/templates/C/C.stg 
./tool/src/main/resources/org/antlr/codegen/templates/C/Dbg.stg 

Et ainsi de suite.

fichier Mon C.G:

grammar C; 

options { language='CPP'; } 

/** Match things like "call foo;" */ 
r : 'call' ID ';' {System.out.println("invoke "+$ID.text);} ; 
ID: ('a'..'z'|'A'..'Z'|'_')('0'..'9'|'a'..'z'|'A'..'Z'|'_')* ; 
WS: (' ' |'\n' |'\r')+ {$channel=HIDDEN;} ; // ignore whitespace 

Erreurs:

error(10): internal error: group Cpp does not satisfy interface ANTLRCore: missing templates [lexerRuleRefAndListLabel, parameterSetAttributeRef, scopeSetAttributeRef, returnSetAttributeRef, lexerRulePropertyRef_text, lexerRulePropertyRef_type, lexerRulePropertyRef_line, lexerRulePropertyRef_pos, lexerRulePropertyRef_index, lexerRulePropertyRef_channel, lexerRulePropertyRef_start, lexerRulePropertyRef_stop, ruleSetPropertyRef_tree, ruleSetPropertyRef_st] 

error(10): internal error: group Cpp does not satisfy interface ANTLRCore: mismatched arguments on these templates [outputFile(LEXER, PARSER, TREE_PARSER, actionScope, actions, docComment, recognizer, name, tokens, tokenNames, rules, cyclicDFAs, bitsets, buildTemplate, buildAST, rewriteMode, profile, backtracking, synpreds, memoize, numRules, fileName, ANTLRVersion, generatedTimestamp, trace, scopes, superClass, literals), optional headerFile(LEXER, PARSER, TREE_PARSER, actionScope, actions, docComment, recognizer, name, tokens, tokenNames, rules, cyclicDFAs, bitsets, buildTemplate, buildAST, rewriteMode, profile, backtracking, synpreds, memoize, numRules, fileName, ANTLRVersion, generatedTimestamp, trace, scopes, superClass, literals), lexer(grammar, name, tokens, scopes, rules, numRules, labelType, filterMode, superClass), rule(ruleName, ruleDescriptor, block, emptyRule, description, exceptions, finally, memoize), alt(elements, altNum, description, autoAST, outerAlt, treeLevel, rew), tokenRef(token, label, elementIndex, hetero), tokenRefAndListLabel(token, label, elementIndex, hetero), listLabel(label, elem), charRangeRef(a, b, label), ruleRef(rule, label, elementIndex, args, scope), ruleRefAndListLabel(rule, label, elementIndex, args, scope), lexerRuleRef(rule, label, args, elementIndex, scope), lexerMatchEOF(label, elementIndex), tree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel)] 

error(10): internal error: C.g : java.lang.IllegalArgumentException: Can't find template actionGate.st; group hierarchy is [Cpp] 

... et ainsi de suite.

Veuillez nous aviser. Je vous remercie! J'utilise Leopard 10.5.8 avec

CLASSPATH=:/Users/vietlq/projects/antlr-3.2.jar:/Users/vietlq/projects/stringtemplate-3.2.1/lib/stringtemplate-3.2.1.jar:/Users/vietlq/projects/stringtemplate-3.2.1/lib/antlr-2.7.7.jar 

Répondre

9

On dirait que vous avez répondu à votre propre question: C++ générateurs lexer/analyseur de ANTLR ne sont pas encore fonctionnels.

Pour ce que ça vaut, il est toujours possible d'utiliser ANTLR pour l'analyse à partir de C++, via la cible C. J'utilise ANTLR pour générer un lexer et un analyseur de langage C, que je compile ensuite et que je lie à mon code C++.

J'ai un fichier C++ qui traduit un arbre d'analyse ANTLR en mes classes d'arbre de syntaxe abstraite cible, et le reste de mon code ne se soucie pas de savoir d'où provient l'AST. Cela fonctionne plutôt bien en pratique! Il serait facile de remplacer ANTLR par un autre générateur d'analyseur, et je trouve que la séparation conduit à des grammaires ANTLR plus propres.

+0

Salut Ben, voulez-vous s'il vous plaît libérer votre outil C++ sous licence open source? Je vous remercie! – Viet

4

J'ai publié une cible C++ pour ANTLR. Vérifie s'il te plaît.

+0

Pourriez-vous s'il vous plaît poster le lien? Je vous remercie! – Viet

+1

http://www.antlr.org/wiki/pages/viewpage.action?pageId=29130826 – Gokul

+0

+1 très bien! Merci d'avoir partagé! – Viet