ANTLR 3.2でのC ++コード生成の準備ができていますか?
-
11-09-2019 - |
質問
私はANTLR 3.2は、C ++におけるパーサ/レクサを生成するために努力しました。それは無益でした。物事は、しかしJavaとCでうまくいっています。
私は始めるためにこのチュートリアルを使用していた:のhttp:/ /www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.htmlする
私は* .STGファイルをチェックすると、私が発見した。
CPPがいるだけ。
./tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg
Cは、非常に多くのファイルがあります:
./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
そしてそう他の言語ます。
私の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
エラーます:
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]
...というように。
親切に教えてください。ありがとうございました!私はLeopardの10.5.8を使用しています。
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
解決
あなたがあなた自身の質問に答えてきたように、
ですね:。ANTLRのC ++字句解析/パーサジェネレータがまだ機能しません。
何が価値があるために、それは、Cターゲットを経由して、C ++から解析するためにANTLRを使用することは可能です。私はその後、私のC ++コードにコンパイルとリンクC言語のレクサーとパーサを生成するためにANTLRを使用します。
私は自分の目標抽象構文木クラスにANTLRの解析木を変換する1つのC ++のファイルを持っている、とASTはどこから来るか私のコードの残りの部分は気にしません。それは実際にはかなりうまく動作します!別のパーサジェネレータでANTLRを交換するのは簡単だろう、と私は分離がきれいANTLR文法につながることがわかります。
他のヒント
私はANTLRのためのC ++のターゲットを掲載しています。それをチェックアウトしてください。
所属していません StackOverflow