1

次のようなコマンド シェルを解析する必要があります。

cp /home/test /home/test2

私の問題は、正しいパスの解析にあります。

ルールを定義しました (トークンをパスとして使用することはできませんが、パーサーで定義する必要があります):

path : ('/' ID)+;

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

トークン WS を非表示にしておく必要がありますが、これにより、この例の 2 つのパスが 1 つのパスと見なされるという問題が発生します。

どうすればこの問題を解決できますか?

ありがとう

4

2 に答える 2

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' のため、各コマンドは別の行にある必要があります。

于 2010-02-03T16:13:51.210 に答える
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 コマンドで動作するようです。しかし、あなたのパスは4つのトークンのリストであり、すぐに簡単に分割できなかったため、個人的にはこれがあまり好きではありません. そのため、コマンドとパスの間に規則が必要になる場合があります (シェル コマンドには、ファイルを操作するコマンドと、ディレクトリを操作するコマンドがいくつかあると想定しているため)。

また、ID と WS lexer ルールがあなたの望むものであることを願っています。

于 2010-02-03T23:33:24.647 に答える