Antlr3解析器路径命令外壳

问题描述:

我需要解析的命令外壳,如:Antlr3解析器路径命令外壳

cp /home/test /home/test2 

我的问题是在正确的路径解析。

我定义的规则(我不能使用令牌路径,但我需要在解析器来定义它):

path : ('/' ID)+; 

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

我需要保持令牌WS隐藏的,但是这给了我这个例子中的2条路径被认为是单一路径的问题。

我该如何解决这个问题?

感谢

随着一点点的打在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

好吧,根据您的意见,怎么样像这样:

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词法分析器规则是你想要的。