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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top