【问题标题】:Is C++ code generation in ANTLR 3.2 ready?ANTLR 3.2 中的 C++ 代码生成准备好了吗?
【发布时间】:2010-12-22 08:06:46
【问题描述】:

我正在努力让 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

【问题讨论】:

    标签: c++ code-generation parsing lexer antlr3


    【解决方案1】:

    听起来您已经回答了自己的问题:ANTLR 的 C++ 词法分析器/解析器生成器还没有功能。

    不管怎样,仍然可以使用 ANTLR 通过 C 目标从 C++ 进行解析。我使用 ANTLR 生成 C 语言词法分析器和解析器,然后我编译并链接到我的 C++ 代码。

    我有一个 C++ 文件,可以将 ANTLR 解析树转换为我的目标抽象语法树类,而我的其余代码并不关心 AST 的来源。它在实践中效果很好!用不同的解析器生成器替换 ANTLR 会很容易,我发现这种分离会导致更清晰的 ANTLR 语法。

    【讨论】:

    • 嗨,Ben,您能在开源许可下发布您的 C++ 工具吗?谢谢!
    【解决方案2】:

    我已经为 ANTLR 发布了一个 C++ 目标。请检查一下。

    【讨论】:

    • 能发一下链接吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-07-14
    • 2015-11-08
    • 2017-12-23
    相关资源
    最近更新 更多