을이 작업 : 나는 몇 가지 더 렉서 규칙을 만들 수 있다고
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;};
주의하시기 바랍니다 다음 다른 파서를 넣어 시작 테스트 할 규칙. 나는 자바 타겟을 사용하여 당신이 원하는 것을 대상으로 사용할 것이다.
오 그래, 각 명령은 명령 규칙에서 '\ 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 명령 작업을 나타납니다 : 이런 식으로 뭔가에 대해 어떻게 귀하의 의견에 따라 확인
명령 규칙을 지금 확장하고 싶습니다. 명령 : 'cp'first = path second = path '\ n'{...} | 'del'path {... 너 이 규칙이 당신의 행동에 사용할 수있는 유일한 경로를 가지고 있습니다.} | 'compare'first = path second = path third = path {여기서 첫 번째를 두 번째와 비교하고 세 번째 자리를 비교하는 코드}; 물론 이것은 CMD 렉서 규칙을 쓸모 없게 만들 수도 있습니다 (필수는 아닙니다). 그러나 이러한 작업을 할 수있는 다른 방법이있을 수도 있습니다. – WayneH
좋아요, 빠른 답변을 주셔서 감사하지만 다른 경우에는 토큰 (FILE)으로 경로를 정의하지 않기 때문에 제 경우에는 작동하지 않습니다. 공백 (숨겨진 토큰)을 구분 기호로 사용하는 것이 가능합니다 (단일 토큰으로 정의되지 않은 경로 사용). – Nio