سؤال

كنت أحاول من الصعب جعل 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

ولغات أخرى.

ملف CG الخاص بي:

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]

... وما إلى ذلك وهلم جرا.

يرجى التفضل تقديم المشورة. شكرا لك! أنا أستخدم ليوبارد 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
هل كانت مفيدة؟

المحلول

يبدو أنك قد أجبت على سؤالك الخاص: لم يكن مولدات Lexer / Glexer C ++ من Antlr.

ما يستحق، ما زال من الممكن استخدام Antlr للحصول على تحليل من C ++، عبر الهدف C. يمكنني استخدام Antlr لإنشاء Lock Lock Locker ومحلل محلل، والذي أردج ثم ارتباطه برمز C ++ الخاص بي.

لدي ملف واحد C ++ يترجم شجرة تحليل Antlr إلى فئات شجرة بناء جملة مجردة مستهدينة، ولا يهتم بقية التعليمات البرمجية حيث يأتي AST. يعمل بشكل جيد في الممارسة! سيكون من السهل استبدال مضاد مع مولد محلل تحلل مختلف، وتجد أن الفصل يؤدي إلى نظافة قواعد الأنطور.

نصائح أخرى

لقد نشرت هدف C ++ ل Antlr. يرجى التحقق من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top