我需要解析命令shell,例如:
cp /home/test /home/test2
我的问题在于正确的路径解析。
我定义了一个规则(我不能使用令牌作为路径,但我需要在解析器中定义它):
path : ('/' ID)+;
与
ID: (A.. Z | a.. z) +;
WS: (' ') {$channel = HIDDEN;};
我需要隐藏令牌WS,但是这给我的问题是这个例子中的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规则是你想要的。