Командная оболочка пути анализатора Antlr3 - PullRequest
1 голос
/ 03 февраля 2010

Мне нужно разобрать командную оболочку, такую ​​как:

cp /home/test /home/test2

Моя проблема в правильном разборе пути.

Я определил правило (я не могу использовать токен в качестве пути, но мне нужно определить его в анализаторе):

path : ('/' ID)+;

с

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

Мне нужно сохранить токен WS скрытым, но из-за этого возникает проблема, заключающаяся в том, что 2 пути в этом примере рассматриваются как один путь.

Как я могу решить эту проблему?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 февраля 2010

Хорошо, на основании вашего комментария, как насчет этого:

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, указанной выше. Но, в общем-то, мне это не очень нравится, потому что ваш путь - это список из четырех токенов, и я быстро не мог его легко разделить. Таким образом, вам может потребоваться правило между командой и путем (поскольку я предполагаю, что ваша команда оболочки может иметь некоторые команды, которые работают с файлами, в то время как другие работают с каталогами).

Я также надеюсь, что вы хотите использовать правила ID и лексера WS.

0 голосов
/ 03 февраля 2010

Немного поиграв в 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' в правиле команды.

...