Frage

Ich habe mich bemüht, Antlr 3.2 in C ++ Parser/Lexer zu erzeugen. Es war fruchtlos. Mit Java & C lief es jedoch gut.

Ich habe dieses Tutorial verwendet, um loszulegen: http://www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.html

Als ich die *.stg -Dateien überprüfte, fand ich Folgendes:

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 CG -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]

... usw.

Bitte raten Sie bitte. Vielen Dank! Ich benutze 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
War es hilfreich?

Lösung

Es hört sich so an, als hätten Sie Ihre eigene Frage beantwortet: Die C ++ Lexer/Parser -Generatoren von Antlr sind noch nicht funktional.

Für das, was es wert ist, ist es immer noch möglich, Antlr für das Parsen von C ++ über das C -Ziel zu verwenden. Ich verwende Antlr, um einen C -Sprache Lexer und Parser zu generieren, den ich dann kompiliere und mit meinem C ++ - Code verlinke.

Ich habe eine C ++ - Datei, die einen Antlr -Parse -Baum in meine Target -abstrakten Syntax -Baumklassen übersetzt, und der Rest meines Codes ist es egal, woher der AST stammt. Es funktioniert in der Praxis ziemlich gut! Es wäre einfach, Antlr durch einen anderen Parser -Generator zu ersetzen, und ich finde, dass die Trennung zu saubereren Antlr -Grammatiken führt.

Andere Tipps

Ich habe ein C ++ - Ziel für Antlr gepostet. Bitte überprüfen Sie es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top