2010-02-03 3 views
1

나는 같은 명령 쉘을 구문 분석 할 필요가있다. Antlr3 파서 경로 명령 쉘

나는 규칙 정의 (나는 경로로 토큰을 사용할 수 없습니다를하지만 난 파서를 정의 할 필요) : 나는 토큰 WS를 유지해야

path : ('/' ID)+; 

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

로 숨겨져 있지만이 예제에서는이 두 경로는 단일 경로로 간주됩니다.

이 문제를 어떻게 해결할 수 있습니까?

감사

내가 얻을 수 있었다 ANTLRWorks의 주위에 약간의 연주와

답변

0

을이 작업 : 나는 몇 가지 더 렉서 규칙을 만들 수 있다고

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 명령 작업을 나타납니다 : 이런 식으로 뭔가에 대해 어떻게 귀하의 의견에 따라 확인

+0

명령 규칙을 지금 확장하고 싶습니다. 명령 : 'cp'first = path second = path '\ n'{...} | 'del'path {... 너 이 규칙이 당신의 행동에 사용할 수있는 유일한 경로를 가지고 있습니다.} | 'compare'first = path second = path third = path {여기서 첫 번째를 두 번째와 비교하고 세 번째 자리를 비교하는 코드}; 물론 이것은 CMD 렉서 규칙을 쓸모 없게 만들 수도 있습니다 (필수는 아닙니다). 그러나 이러한 작업을 할 수있는 다른 방법이있을 수도 있습니다. – WayneH

+0

좋아요, 빠른 답변을 주셔서 감사하지만 다른 경우에는 토큰 (FILE)으로 경로를 정의하지 않기 때문에 제 경우에는 작동하지 않습니다. 공백 (숨겨진 토큰)을 구분 기호로 사용하는 것이 가능합니다 (단일 토큰으로 정의되지 않은 경로 사용). – Nio

0

,. 그러나 당신의 경로가 네 개의 토큰 목록이므로 신속하게 분리 할 수 ​​없기 때문에 열정적으로 나는 이것을 좋아하지 않습니다. 따라서 명령과 경로 사이에 규칙이 필요할 수도 있습니다 (셸 명령에 파일 작업을하는 명령이 있고 디렉토리에서 작업하는 명령이 있다고 가정하기 때문에).

ID 및 WS 렉서 규칙이 원하는대로되기를 기대합니다.