2015-02-09 81 views
0

我知道詞法規則是匹配單詞而不是句子。但有可能做到這一點。因爲我的輸入有類似下面的格式Lexer規則的句子

ADD FILE first-doc VERSION 1 TYPE sequential FIXED 23 BLOCK 23 MODE 
ebdic LABEL standard KEY REC_NR#09545 RULE DOMANI _ scorebestand MKC 

和花葯輸入可以有一個像

ADD FILE secound-doc VERSION 3 TYPE normal FIXED 39 BLOCK 39 MODE 
gdieds LABEL constant KEY CTR-NR#62872 
RULE CBTPSN49 : dagextract (loadfile) met key PIB_KLN_NR 

在兩個輸入我上面的解析器規則如下

add_file : 
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 
'LABEL' String KEY key=String ; 

我能寫直到KEY,因爲所有內容都是單個單詞,但不能進一步與RULE進行,因爲它隨着句子的不同而變化

即使我試圖與貪婪匹配

All : .*; 

但它拋出的錯誤我。

詞法分析規則上面statment

WhiteSpace: ('\r' | '\t' | '\u000C' | '\n' | ' ') { $channel=HIDDEN; }; 

COMMENT:('**'.*'\n'|'REMARKS'.*'\n')*{skip();}; 

String: ('a'..'z'|'A'..'Z'|'-'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#')*; 

Integer: '-'? ('0' | '1'..'9' ('0'..'9')*); 

我的問題是「是否有可能與一個詞法規則匹配多個單詞? 如果是這樣那怎麼辦?」

我只能在ANTLR 4中實現這個功能嗎?我只有兩個星期到這個ANTLR 請幫忙。

在此先感謝

回答

1

ANTLR4解析器該條規則的一切,直到行的末尾。

add_file : 
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 
'LABEL' String 'KEY' key=String 'RULE' expr=everything_until_CR '\r'? '\n'?; 

everything_until_CR : ~('\n'|'\r')* ; 

ANTLR3,這個不幸的是似乎沒有工作。解決方法詞法分析器規則如下。您必須去除目標語言中的前導「規則」。

RULE : 'RULE ' ~('\n'|'\r')* ; 

add_file : 
    'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
    'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 
    'LABEL' String 'KEY' key=String 
    expr=RULE '\r'? '\n'? {System.out.println($expr.text.substring(5));} 
; 

如果你真的需要上下文敏感詞法規則,看看island grammars(鏈接到ANTLR3 DOC)。 '希望這可以幫助!

+0

嗨@Marc Q. 'everything_until_CR:〜(」 \ n')+;'在我的情況下不起作用 – Mahes 2015-02-10 05:02:54

+0

嗨,Mahes!我對ANTLR3的假設是對的嗎?你不使用ANTLR4的原因是什麼? – 2015-02-10 07:00:14

+0

是的,我只使用ANTLR 3。我沒有安裝Antlr 4 Eclipse插件的Eclipse 4。儘管我嘗試使用build.xml生成詞法分析器和分析器。但語法不同於ANTLR 3到ANTLR 4,ANTLR 4沒有采用重寫規則。由於我的時間非常短,我繼續使用ANTLR 3 – Mahes 2015-02-10 07:06:09

0

我想出了另一種解析句子的方法,最後加上String*。請各位看看下面我的語法和它的接縫做工精良

add_file : 'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 'LABEL' String 'KEY' key=String 'RULE' String*;

//詞法規則的字符串

String: ('a'..'z'|'A'..'Z'|'-'|'#'|':') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#'|':')*;