2010-03-20 36 views
1

我只是玩ANTLR,並決定嘗試解析JavaScript。但是我在處理可選的'''時撞牆了;'在它裏面,語句結尾用換行符標記。它能以一種簡單的方式完成嗎?ANTLR,可選';'在JavaScript中

只是一個簡單的語法例子不起作用

grammar optional_newline; 
def   : statements ; 
statements : statement (statement)* ; 
statement : expression (';' | '\n') ; 
expression : ID | INT | 'var' ID '=' INT ; 
ID   : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
INT   : '0'..'9'+ ; 
WS   : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ; 

,我希望能夠解析的(這可以通過JavaScript的解析器解析)

var i = 
10 
10; 

PS:我不我不想將WS放在解析器規則中,如果詞法分析器剛剛擺脫那些,我會更加高興。

+0

我想你已經看了成ECMA腳本語法張貼在ANLR-wiki上:http://www.antlr.org/grammar/list? – 2010-03-21 19:05:57

+0

@Bart,是的,但他們在每個規則中都特別允許空格。我不喜歡這種方式,儘管我懷疑這是唯一可能的方式。但是我希望我錯了,而且有人知道如何解決這個問題,而不會弄亂語法。 – vava 2010-03-22 02:06:01

+0

我以爲你有,但想確保。我也會考慮它,雖然我懷疑它沒有辦法... – 2010-03-22 07:11:48

回答

0

我不知道這是否會在可能在JavaScript中所有的情況下工作,但它正確地分析你的例子:

grammar js; 

def   : statements ; 
statements : statement (statement)* ; 
statement : expression ';'? ; 
expression : ID | INT | 'var' ID '=' INT ; 
ID   : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
INT   : '0'..'9'+ ; 
WS   : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ; 

alt text http://img249.imageshack.us/img249/7131/parsetree.jpg

+0

但它也會解析'10 10',這是不允許的:) – vava 2010-03-20 15:26:06

+0

你能解釋一下分號應該在哪裏以及它應該在哪裏是可選的?我不得不看看JavaScript語法的細節,可能需要一段時間.. – stmax 2010-03-20 21:30:39

+0

這或多或少容易,每';'這意味着句子的結尾可以換行換行。但在所有其他情況下,換行符都被忽略了。 – vava 2010-03-22 02:03:09