2011-09-05 58 views
1

我有一個ANTLR的語法是這樣的:製作ANTLRWorks處理空格自動

grammar HelloGrammar1; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
STATEMENT : 'hello' ID ';' ; 
WS : (' '|'\t'|'\r'|'\n')* ; 

我希望它來分析以下文字:hello qwerty ;。它不以這種方式工作。如果我將字符串更改爲helloqwerty;,則一切正常。我也可以改變語法爲:

grammar HelloGrammar2; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
STATEMENT : 'hello' WS ID WS ';' ; 
WS : (' '|'\t'|'\r'|'\n')* ; 

而在這種情況下,hello qwerty ;工作正常。是否有可能讓ANTLR自動跳過空格? (即 - 我想讓HelloGrammar1工作,hello qwerty ;

更新

如果它是有道理的:我在ANTLRWorks測試它。

更新2

也試過這樣:

grammar HelloGrammar; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
STATEMENT : 'hello' ID ';' ; 
WS : (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ; 

還不行。

更新3

我使用的是選擇了 「聲明」 規則 「解釋」 選項卡。

+0

什麼是想要被允許的輸入? – luketorjussen

+0

請注意,詞法分析器規則不應生成可(可能)匹配零個字符(空字符串)的標記。詞法分析器會產生無數的數字。因此'('''''''''''''''''''')*'應該是'(''''''''''''''''或'(' ''''\ t'|'\ r'|'\ n')+'。 –

回答

2

我認爲這個問題可能是你應該改變聲明(目前詞法規則)來聲明(解析器規則)

grammar HelloGrammar; 

statement : 'hello' ID ';' ; 
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
WS : (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ; 

在ANTLRWorks此接受:

hello qwerty; 
hello qwerty; 
hello loki2302; 
hello qwerty ; 

但不接受:

helloqwerty; 
helloqwerty ; 
hello; 
hello qwerty