2011-04-24 4 views
1

현재 회사에서 사용하는 사내 언어 용 Eclipse 기반 편집기를 작성하려고합니다. 이 언어는 다음 형식의 문장으로 구성됩니다.Xtext의 문자열 구문 분석

{action}: {arguments} 

... 자체 회선. {arguments}의 형식은 수행중인 {action}의 유형에 따라 다릅니다. 스크립트 조각의 예는 다음과 같습니다.

banner: Some string with numbers and punctuation (23) in it! 
# some comment 
timeout: 42 

내 조각 문제와 같은 조각을 구문 분석하고 있습니다. 댓글과 타임 아웃 문이 작동하지만 배너 문을 다루는 규칙을 만들 수없는 것 같습니다. 모든 시도가 Antlr의 "token definition unreachable"경고가되거나 편집기가 입력을 일치시킬 수 없습니다. 나에게 ANTLR 경고를주는 ...

Banner: 
    'banner:' name=ANY_OTHER*; 

Banner: 
    'banner:' name=FF_STRING; 
terminal FF_STRING : ('a'..'z'|'A'..'Z'|'0'..'9'|'.'|':'|' ')+; 

: 나는 배너 문에 대한 다음과 같은 규칙을 시도했습니다. 내가 해킹 한 것은 처음에는 '#'대신 'banner :'를 사용하여 SL_COMMENT와 동일한 터미널을 간단하게 만드는 것입니다. 단점은 구문 색상 표시가 없으며 자동 완성 목록에 '배너'가 표시되지 않는다는 것입니다.

어떤 조언을 환영합니다.

답변

4

데이터 형식 규칙과 축소 된 터미널 규칙 집합을 사용할 수 있습니다. 다음과 같이 작동 할 수 있습니다.

Banner 
    'Banner:' name=Value; 
Value hidden(): 
    (ID | WS | INT | <any keyword from your grammar>)* LineBreak; 
terminal LineBreak: '\r' '\n'? | '\n'; 
termianl WS: (' '|'\t') * 
+0

감사합니다. 이것은 여전히 ​​효과가있는 것처럼 보이지만, 내 판단 규칙에 ':'을 추가하려고하면 antlr "결정이 다음과 같은 입력과 일치 할 수 있습니다."라는 경고가 표시됩니다. 이는 '배너'(즉, 배너와 콜론 사이에 공백이있을 수 있음) 바로 다음에 별도의 키워드로 ':'이 있기 때문입니다. – Exponent