문제

나는 C ++에서 Antlr 3.2가 Parser/Lexer를 생성하기 위해 열심히 노력하고있었습니다. 결실이 없었습니다. 그래도 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]

... 등등.

친절하게 조언하십시오. 고맙습니다! 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 ++ LEXER/PARSER 생성기는 아직 기능하지 않습니다.

그만한 가치가 있으므로 C ++에서 구문 분석에 C ++를 통해 Antlr을 사용하는 것이 여전히 가능합니다. ANTLR을 사용하여 C 언어 Lexer 및 Parser를 생성 한 다음 C ++ 코드로 컴파일하고 연결합니다.

Antlr Parse 트리를 대상 추상 구문 트리 클래스로 변환하는 C ++ 파일 하나가 있으며 나머지 코드는 AST의 출처를 신경 쓰지 않습니다. 실제로는 꽤 잘 작동합니다! ANTLR을 다른 파서 생성기로 대체하는 것은 쉬우 며, 분리가 세정제 antlR 문법으로 이어진다는 것을 알았습니다.

다른 팁

antlr에 대한 C ++ 목표를 게시했습니다. 그것을 확인하시기 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top