2010-06-19 4 views
1

텍스트와 숫자로 구성된 일부 텍스트를 구문 분석하기 위해 며칠 동안 노력했습니다. (필자는 문법으로 문장을 작성했습니다.)Antlr을 사용하여 모호한 입력 구문 분석

sentence options { 
      greedy=false; 
    } 
     : (ANY_WORD | INT)+; 

나는 그때 sentence_with_int "14 개 신발 구입 크기의 수는 3이었다"이었다 일부 입력이 있다면 그래서 INT

sentence_with_int 
     : sentence INT; 

으로 완료 문장의 구문 분석에 필요한 규칙을 단지 문장이 일치하지 않을 것이다. 이 작업을 수행하는 더 좋은 방법이있을 것이라고 확신하지만 도구를 배우는 중입니다.

감사, 리처드

답변

2

당신의 문법 :

grammar Test; 

sentence_with_int 
    : sentence {System.out.println("Parsed: sentence='"+$sentence.text+"'");} 
    INT  {System.out.println("Parsed: int='"+$INT.text+"'");} 
    ; 

sentence 
    : (ANY_WORD | INT)+ 
    ; 

ANY_WORD 
    : ('a'..'z' | 'A'..'Z')+ 
    ; 

INT 
    : ('0'..'9')+ 
    ; 

WS 
    : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} 
    ; 


는 정확히 않습니다. 여기에 약간의 테스트 장치입니다 :

 
java -cp antlr-3.2.jar org.antlr.Tool Test.g 

을 모든 .java 소스 파일을 컴파일 :

import org.antlr.runtime.*; 

public class Demo { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("the number of size 14 shoes bought was 3"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.sentence_with_int(); 
    } 
} 

먼저 파서 & 렉서를 생성 (모든 파일을 가정하고, ANTLR 항아리, 같은 디렉토리에 있습니다) :

 
javac -cp antlr-3.2.jar *.java 

마지막으로 Demo 클래스 실행

 
java -cp .:antlr-3.2.jar Demo 

다음과 같은 출력을 생성

(Windows의 하는 ;: 교체) :

 
Parsed: sentence='the number of size 14 shoes bought was' 
Parsed: int='3' 
+0

정말 감사합니다 바트를! –

+0

아무 문제 없어 @ 리차드, 내가 많이하지는 않았지만 : 당신의 문법은 처음부터 훌륭했습니다! :) –