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'。
答
好吧,根据您的意见,怎么样像这样:
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词法分析器规则是你想要的。
我想你现在想扩大命令规则,例如: command:'cp'first = path second = path'\ n'{...} |'del'path {... you只有一条路径用于你的行为中使用此规则} |'比较'第一=路径第二=路径第三=路径{在这里把你的代码来比较第一个和第二个地方在第三个};; 当然,这也会使CMD词法分析规则无用(不要求)。但也可以有其他方法来使这些工作成功。 – WayneH 2010-02-03 16:44:03
好吧,我很欣赏这个快速答案,但在我的情况下它不起作用,因为其他规则强制我不将该路径定义为标记(FILE)。 从我的代码开始(将路径定义为单个标记),可以使用空格(隐藏标记)作为分隔符? – Nio 2010-02-03 17:24:33