2014-07-06 11 views
4

내 동료 폴스는 다음 나에게 물었다 :PEG (Grako)가 부족한 선택 품목을 파싱 하시겠습니까? 그리고 사양이 구조가 유사하다 그것의 규칙이있다 - 나는 기존의 언어 (AN IEEE 표준의 SystemVerilog)에 대한 파서를 쓰고 있어요</p> <hr> <p>:

cover_point 
    = 
    [[data_type] identifier ':' ] 'coverpoint' identifier ';' 
    ; 

data_type 
    = 
    'int' | 'float' | identifier 
    ; 

identifier 
    = 
    ?/\w+/? 
    ; 

문제는 그 다음 법적 문자열을 구문 분석 할 때 :

anIdentifier: coverpoint another_identifier; 

anIdentifier matche을 (해당 식별자 옵션을 통해) data_type을 성공적으로 사용했습니다. 이는 Grako가 그 다음에 다른 식별자를 찾고 실패했음을 의미합니다. 그런 다음 data_type 부분없이 구문 분석을 시도하지 않습니다. 다음과 같이 내가 규칙을 다시 쓸 수

,

cover_point_rewrite 
    = 
    [data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';' 
    ; 

하지만 난 궁금 :

  1. 이 의도적이고 더 나은 구문이 있다면
  2. ?

이는 PEG-에서 총장 문제, 또는 도구 (Grako) 하나인가?

+2

개인적으로는 PEG 파서가 가능한 한 가장 긴 옵션을 선택하도록 문법을 조정해야합니다. – Apalala

답변

2

here PEG에서 선택 연산자는 으로으로 지정되어 첫 번째 일치 항목을 사용하여 CFG 모호성을 피할 수 있습니다.

첫 번째 예제에서

[data_type]
은 ID 분석에 성공하므로 다른 식별자 대신 :이 발견되면 실패합니다. [data_type](data_type | ε)처럼 동작하므로 첫 번째 ID가 항상 data_type 인 것으로 분석됩니다.

[data_type identifier ':' | identifier ':' ]
에서 두 번째 ID가 없을 때 첫 번째 선택이 실패하므로 파서는 두 번째 선택 사항을 역 추적하고 시도합니다.