Antlr3解析器路径命令shell

时间:2010-02-03 14:56:34

标签: path parsing whitespace antlr hidden

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

cp /home/test /home/test2

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

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

path : ('/' ID)+;

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

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

我该如何解决这个问题?

由于

2 个答案:

答案 0 :(得分: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',每个命令都必须在一个单独的行上。

答案 1 :(得分: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 lexer规则是你想要的。