2015-10-07 138 views
1

我有一個很大的語法文件,並計劃將其拆分爲多個文件,以便我可以在另一個語法文件中重用這些較小的文件。我嘗試過,但失敗了。你能否告訴我們這個功能是否可用,如果有的話,請直接給我一個例子。如何將ANTLR語法文件拆分爲多個文件

回答

1

你沒有提到ANTLR版本,所以我打算假設你正在使用當前版本 - 4.x. 在ANTLR4語法中,可以使用import關鍵字導入語法。 事情是這樣的:

文件:CommonLexerRules.g4

lexer grammar CommonLexerRules; 

ID : [a-zA-Z]+ ; 
... 

文件:MyParser.g4

grammar MyParser;  
import CommonLexerRules; //includes all rules from lexer CommonLexerRules.g4 
... 

規則從進口文法「主語法」覆蓋規則來實現繼承。 在此處查看更多詳細信息:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

是的,我使用的版本是antlr4.5-opt。當我嘗試在主語法中引用導入語法中的規則時,我收到以下錯誤消息:對未定義規則的引用:temp_rule(com.tunnelvisionlabs:antlr4-maven-plugin:4.5:antlr4:default:generate-sources ) –

+0

儘量減少導入的和主要的語法文件到絕對最小值,只是爲了演示錯誤,並在原始問題中添加文件內容 – user3890638

0

如果要分割詞法分析器和分析器。

詞法:

lexer grammar HelloLexer; 
Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

分析器:

parser grammar HelloParser; 
options { tokenVocab=HelloLexer; } 
r : Hello ID ;  

記住命名文件HelloLexer.g4和HelloParser.g4

如果要導入整個語法,那麼你應該使用導入關鍵字

grammar Hello; 

import OtherGrammar; 

Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines  
r : Hello ID ; 
+1

不應該是'import HelloParser;'? – Boriel