Est-ce que la génération de code C dans ANTLR 3.2 prêt?
-
11-09-2019 - |
Question
Je tentais difficile de faire ANTLR 3.2 générer analyseur / lexer en C ++. Il était inutile. Les choses se sont bien passées avec Java & C bien.
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:
RPC 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 d'autres langues.
Mon fichier 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.
S'il vous plaît de bien vouloir conseiller. 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
La solution
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 la peine, il est toujours possible d'utiliser ANTLR pour l'analyse syntaxique de C ++, via la cible C. J'utilise ANTLR pour générer un lexer en langage C et analyseur, que je puis compiler et un lien vers mon code C ++.
J'ai un fichier C ++ qui se traduit par un arbre d'analyse syntaxique ANTLR à mes classes d'arbres cibles de syntaxe abstraite, et le reste de mon code ne se soucie pas du AST vient. Il fonctionne très bien dans la pratique! Il serait facile de remplacer ANTLR avec un générateur d'analyseur différent, et je trouve que la séparation conduit à grammaires ANTLR propres.
Autres conseils
J'ai posté un C ++ cible pour ANTLR. S'il vous plaît vérifier.