2009-12-02 7 views
7

Ich habe mich sehr bemüht, ANTLR 3.2 in C++ Parser/Lexer erzeugen zu lassen. Es war fruchtlos. Die Dinge liefen gut mit Java & C obwohl.Ist C++ - Code-Generierung in ANTLR 3.2 bereit?

ich dieses Tutorial wurde mit zu beginnen: http://www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.html

Wenn ich die * .stg Dateien überprüft, fand ich, dass:

CPP hat nur

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

C hat so viele Dateien :

./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 

Und so andere Sprachen.

Meine C.g Datei:

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 

Fehler:

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] 

... und so weiter.

Bitte freundlich beraten. Vielen Dank! Ich bin mit Leopard 10.5.8 mit

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 

Antwort

9

Es klingt wie Sie Ihre eigene Frage beantwortet haben: ANTLR des C++ Lexer/Parser-Generatoren sind noch nicht funktionsfähig.

Für was es wert ist, ist es immer noch möglich, ANTLR für das Parsen von C++ über das C-Ziel zu verwenden. Ich benutze ANTLR, um einen C-lexer und einen Parser zu erzeugen, die ich dann kompiliere und mit meinem C++ Code verbinde.

Ich habe eine C++ - Datei, die einen ANTLR-Syntaxbaum in meine abstrakten Klassenstrukturen übersetzt, und der Rest meines Codes interessiert nicht, woher der AST kommt. Es funktioniert ziemlich gut in der Praxis! Es wäre leicht, ANTLR durch einen anderen Parser-Generator zu ersetzen, und ich finde, dass die Trennung zu saubereren ANTLR-Grammatiken führt.

+0

Hallo Ben, würden Sie bitte Ihr C++ - Tool unter Open-Source-Lizenz freigeben? Vielen Dank! – Viet

4

Ich habe ein C++ Target für ANTLR gepostet. Bitte schau es dir an.

+0

Könnten Sie bitte den Link posten? Vielen Dank! – Viet

+1

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

+0

+1 großartig! Danke für das Teilen! – Viet