2013-04-03 3 views
0

ANTLR을 사용하여 입력을 구문 분석하는 데 매우 특별한 요구 사항이 있습니다. 나는 다음과 같은 표현을 파싱 할 수 있기를 바란다.Antlr 사용자 정의 요구 사항 분석기

올바른 입력

  • 사용자 이름
  • _ 이름 사용자 이름
  • | 어떤 것도 여기에 올 수 있어요/OK | EATALL ...

잘못된 입력

  • 사용자/이름
  • 사용자 & 이름^얼굴

음, 올 어떤 표현 | EATALL & | EATALL 전 (있는 경우 후 any)는 단일 토큰으로 얻어야합니다. | EATALL이 표시되지 않는 다른 간단한 입력의 경우 _, -, [a-zA-Z0-9]의 유효한 조합 만 하나의 토큰으로 토큰 화됩니다. 의사에서,

  • 사용자 이름 -> [사용자] [이름]
  • _ 이름 -> [USER_NAME]
  • | EATALL 사용자/내 사용자 이름 -> [사용자/이름을 내 사용자]

이것은 이미 나를위한 토큰 화의 모호한 사례처럼 보입니다. 나는 antlr에서 이러한 문제를 다루는 것에 대한 귀하의 제안을 모색 중입니다. 진심으로 감사드립니다.

+0

처음에는 문제가 정규식에 의해 처리 될 수 있고 문맥없는 문법을 필요로하지 않는 것처럼 보입니다. Antlr이 필요하지 않습니다. –

+0

이것은 입력 구문 분석 문제의 일부일뿐입니다. 나는 특별히 antlr에 관해 도움을 청하고있다. – consumer

답변

0

그래서 무엇을 시도 했습니까? Antlr 3에만 특정 질문이 있습니까? 아니면 Antlr 4를 사용할 수 있습니까?

Antlr 3의 경우 의미 적 조건자를 사용하여 토큰 규칙 선택을 조건부로 지정할 수 있습니다. Antlr 4에는 기호 의미 론적 술어가 없기 때문에 네이티브 코드 액션을 사용하여 본질적으로 동일한 결과를 얻을 수 있습니다. 예를 들어 (테스트되지 않음) :

lexer grammar eatall ; 

ValidSimple : { isCurrenLineJustTEXTandWS() }? TEXT ; 
-- or -- 
ValidSimple : TEXT (WS TEXT)* EOL? { emitEachTEXTasNewValidSimpleToken(); } ; 

ValidEatAll : IgnoreL .*? IgnoreR { trimIgnoreLRTextfromTokenText(); } ; 
Invalid  : WS+ | .*? EOL?   -> channel(HIDDEN) ; 

IgnoreL : .*? MARK ; 
IgnoreR : MARK .*? EOL? ; 

fragment MARK : '| EATALL' ; 
fragment TEXT : [a-zA-Z0-9_-] ; 
fragment EOL : '\r'? '\n' ; 
fragment WS : [ \t] ; 
+0

저는 Antlrv3의 컨텍스트에서 구체적으로 말하고 있습니다. 말 그대로 나는 붙어있다. 나는 EATALL이 나타날 때 렉서에게 하나의 큰 토큰을 만들고, 간단한 입력의 경우 토큰을 구분할 수있는 방법을 모른다. – consumer

+0

내가 말했듯이, 의미 적 술어를 사용하여 'EatAll'규칙을 사용 가능하게하십시오. 그 규칙을 간단한 입력 규칙 위에 올려 놓으십시오. EadAll 규칙에 대한 원시 코드 작업을 사용하여 토큰 텍스트에서 원하지 않는 텍스트를 잘라냅니다. – GRosenberg

+0

EatAll 규칙에 [욕심이없는 와일드 카드] (http://www.antlr.org/wiki/display/ANTLR4/Wildcard+Operator+and+Nongreedy+Subrules#WildcardOperatorandNongreedySubrules- 비 교리적인 요약 행렬)를 사용하여 점수. – GRosenberg