Path Antlr3解析器路径命令shell

Path Antlr3解析器路径命令shell,path,parsing,whitespace,antlr,hidden,Path,Parsing,Whitespace,Antlr,Hidden,我需要解析命令shell,例如: cp /home/test /home/test2 我的问题在于正确的路径解析 我定义了一个规则,我不能使用令牌作为路径,但我需要在解析器中定义它: path : ('/' ID)+; 与 我需要隐藏令牌WS,但这给了我一个问题,即本例中的两条路径被视为一条路径 我怎样才能解决这个问题 谢谢在ANTLRWorks中玩了一会儿,我就可以让它工作了: commands : command+ EOF; command : (CMD fir

我需要解析命令shell,例如:

cp /home/test /home/test2
我的问题在于正确的路径解析

我定义了一个规则,我不能使用令牌作为路径,但我需要在解析器中定义它:

path : ('/' ID)+;

我需要隐藏令牌WS,但这给了我一个问题,即本例中的两条路径被视为一条路径

我怎样才能解决这个问题


谢谢

在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;};
请注意,我必须创建更多的lexer规则,然后开始测试不同的解析器规则。我使用了一个java目标,并将允许您使用任何您想要的目标


哦,是的,由于命令规则中的“\n”,每个命令都必须位于单独的行上。

好的,根据您的评论,这样的命令怎么样:

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命令一起工作。但我不太喜欢这个,因为你的路径是一个由四个标记组成的列表,很快我就无法轻松地拆分出来。所以,您可能需要在command和path之间设置一条规则,因为我假设您的shell命令可能有一些用于文件的命令,而其他命令用于目录


我也希望ID和WS-lexer规则是您想要的。

我想您现在想要扩展命令规则,比如:command:'cp'first=path second=path'\n'{…}|'del'path{…您的操作中只有一条路径可供此规则使用}|'compare'first=path second=path third=path{在这里放置您的代码以比较第一个与第二个以及第三个};当然,这也会使CMD lexer规则变得毫无用处。但也可能有其他方法可以使这些规则发挥作用。好的,我很感激快速回答,但在我的情况下,它不起作用,因为其他规则强制我不要将路径定义为令牌文件。从我的代码开始,路径没有定义为单个令牌,这是可能的要使用空白隐藏标记作为分隔符?
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;};