2012-01-07 3 views
1

AntlrWorks에 따르면 입력 {'AND','OR'..'XOR'}은 두 가지 방법으로 비교할 수 있습니다. 그래픽 디스플레이를 사용해도 일치하는 상황을 파악할 수 없었습니다! 아래 문법에 모호성이 발생하는 이유는 무엇이며 어떻게 제거 할 수 있습니까?ANTLR 문법의 모호함

grammar testg; 

rul : contains_expr ; 

contains_expr: 'CONTAINS' contains_expression 
        //'CONTAINS' contains_or 
     ; 

contains_expression : primary (('OR'|'AND'|'XOR') primary)* 
     ; 

primary options{backtrack = true;} 
: '(' contains_expression ')' 
| class_expression 
; 


class_expression : simple_class_expr 
      | '(' simple_class_expr contains_expr ')' 
      |(simple_class_expr contains_expr) 
     ; 

simple_class_expr: identifier    // RM_TYPE_NAME 
       | identifier identifier  // RM_TYPE_NAME variable 
       | archetype_class_expr 
     | versioned_class_expression 
     | version_class_expression 
     // | identified_obj_expression  // need to be used once VersionedClassExpr is removed 
     ; 

identifier 
    : ID 
    ; 

archetype_class_expr 
    : '.ace' 
    ; 

versioned_class_expression 
    : '.vce' 
    ; 

version_class_expression 
    : '.vnce' 
    ; 

temp : 
     ; 


ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 
+0

sarnold는 ANTLR이 문법에 대해 불평하는 이유를 이미 설명했습니다. 그래도 도움이 필요하면 문법 만 게시하는 대신 문법을 작성하려는 * 언어 *를 설명하십시오. 몇 가지 예를 들어 설명해 주시겠습니까? 혼자 문법을 들여다 보면서 구문 분석하려고하는 언어를 알아내는 데 어려움이 있습니다. –

+0

안녕 바트. 이것은 openEHR의 Archetype Query Language의 Antlr 포트에서 발췌 한 것입니다. http://www.openehr.org/wiki/display/spec/Archetype+Query+Language+Description 기존 문법은 LR 파서 생성기로 작성되었으므로, 왼쪽 재귀와 LR 파서로 쉽게 할 수있는 다른 것들을 없애려한다. 나는 sarnold와 syntactic 술어 덕분에 여기서 질문 한 문제를 해결할 수 있었다. 아마도 더 많은 Antlr 질문을해야 할 것입니다 :) – mahonya

+0

다음 문법을 알고 있습니까? (그것을 테스트하지 않았다!) –

답변

2

문법에 따라 CONTAINS foo bar baz을 어떻게 구문 분석 할 것으로 기대하십니까?

contains_exprCONTAINS과 일치합니다.

contains_expression ""을 호출합니다.

primary ""를 호출합니다.

class_expression ""을 호출합니다.

simple_class_expridentifier 또는 identifier identifier과 일치 할 수 있습니다.

따라서 여기 몇 가지 가능한 구문 분석을 볼 수 있습니다.

가 나는 방식에 어떤 identifier identifier 힘을 궁금 제외이 문제를 해결 제안이없는 도구를 구문 분석에 충분한 새로운이야 말할 죄송
CONTAINS (foo bar) (baz) 
CONTAINS (foo) (bar) (baz) 
CONTAINS (foo) (bar baz) 

의미 : 나는 괄호로 개별 simple_class_expr 경기를 넣었습니다 .