2010-02-03 115 views
1

我需要解析的命令外殼,如:Antlr3解析器路徑命令外殼

cp /home/test /home/test2 

我的問題是在正確的路徑解析。

我定義的規則(我不能使用令牌路徑,但我需要在解析器來定義它):

path : ('/' ID)+; 

ID: (A.. Z | a.. z) +; 
WS: (' ') {$channel = HIDDEN;}; 

我需要保持令牌WS隱藏的,但是這給了我這個例子中的2條路徑被認爲是單一路徑的問題。

我該如何解決這個問題?

感謝

回答

0

隨着一點點的打在ANTLRWorks我能解決這個問題的工作:

commands 
    : command+ EOF; 

command 
    : (CMD first=path second=path '\n') {System.out.println("Command found, first path:" + $first.text + ", and second path:" + $second.text + "\n");}; 

path : FILE {System.out.println("file is:" + $FILE.text);}; 

fragment 
ID: ('A'..'Z'|'a'..'z')('A'..'Z'|'a'..'z'|'0'..'9')+; 
CMD 
    : ID; 
FILE 
    : ('/' ID)+; 
WS: (' '|'\t'|'\r'|'\n') {$channel = HIDDEN;}; 

請注意,我不得不創建幾個詞法規則,然後開始把不同的解析器規則來測試。我使用了一個java目標,並且可以讓你使用任何你想要的目標。

哦,是的,每個命令必須在一個單獨的行上,因爲命令規則中的'\ n'。

+0

我想你現在想擴大命令規則,例如: command:'cp'first = path second = path'\ n'{...} |'del'path {... you只有一條路徑用於你的行爲中使用此規則} |'比較'第一=路徑第二=路徑第三=路徑{在這裏把你的代碼來比較第一個和第二個地方在第三個};; 當然,這也會使CMD詞法分析規則無用(不要求)。但也可以有其他方法來使這些工作成功。 – WayneH 2010-02-03 16:44:03

+0

好吧,我很欣賞這個快速答案,但在我的情況下它不起作用,因爲其他規則強制我不將該路徑定義爲標記(FILE)。 從我的代碼開始(將路徑定義爲單個標記),可以使用空格(隱藏標記)作爲分隔符? – Nio 2010-02-03 17:24:33

0

好吧,根據您的意見,怎麼樣像這樣:

commands 
    : command+ EOF; 

command 
    : (ID ' ' (path)+ ' ' (path)+ '\n') {System.out.println("Command found:" + $command.text + "\n");}; 

path : 
    ('/' ID)+ {System.out.println("path is:" + $path.text);}; 

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

同樣,我能夠很快得到ANTLRWorks這個工作,它似乎與上面列出的cp命令工作。但是,我不太喜歡這個,因爲你的路徑是一個四個令牌的列表,並且很快我不能輕易地分開。所以,你可能需要一條命令和路徑之間的規則(因爲我會假設你的shell命令可能有一些命令可以處理文件,而其他命令可以處理目錄)。

我也希望ID和WS詞法分析器規則是你想要的。