2009-12-02 16 views
7

ANTLR 3.2'yi C++'da ayrıştırıcı/lexer oluşturmaya çalışıyorum. Meyvesizdi. Her ne kadar Java & C ile iyi gitti.ANTLR 3.2'de C++ kod üretimi hazır mı?

Bu öğretici kullanıyordum Başlamak için:

CPP sadece

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

C sahiptir kadar çok dosya vardır: http://www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.html

ben * .stg dosyaları işaretlendiğinde, bunu buldum Diğer diller de .

Benim C.g dosyası:

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 

hatalar:

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] 

... vb.

Lütfen tavsiye edin. Teşekkür ederim! Ben Kendi sorunuzu Yanıtım gibi geliyor

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 

cevap

9

ile Leopard 10.5.8 kullanıyorum: antlr en C++ lexer/ayrıştırıcı jeneratörler henüz işlevsel değildir.

Değeri için, C++ ile C hedefi ayrıştırmak için ANTLR kullanmak hala mümkündür. Ben bir C dili lexer ve ayrıştırıcı oluşturmak için ANTLR kullanın, sonra derlemek ve C++ koduma bağlantı.

Bir ANTLR ayrıştırma ağacını hedef özet sözdizimi ağaç sınıflarıma çeviren bir C++ dosyası var ve kodumun geri kalanı da AST'nin nereden geldiğini umursamıyor. Pratikte gayet iyi çalışıyor! ANTLR'yi farklı bir ayrıştırıcı üreteci ile değiştirmek kolay olurdu ve ayırmanın daha temiz ANTLR dilbilgisine yol açtığını görüyorum.

+0

Merhaba Ben, C++ aracınızı açık kaynak lisansı altında bırakır mısınız lütfen? Teşekkür ederim! – Viet

4

ANTLR için bir C++ hedefi yayınladım. Lütfen kontrol et.

+0

Bağlantıyı gönderebilir misiniz? Teşekkür ederim! – Viet

+1

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

+0

+1 harika! Paylaşım için teşekkürler! – Viet