2014-12-28 10 views
0

상당히 복잡한 표현식 언어를 구문 분석 할 수있는 Jison을 사용하여 파서를 작성하고 있습니다. 이 언어에서 , 그것은 지원 문법 같은 :Jison에게 불필요한 세부 사항을 무시하도록 요청하십시오.

여기
stats_expression 
    : stats_function '(' eval_expression ')' 
    | other_stats_aggregation 
    ; 

stats_function 
    : SUM 
    | AVERAGE 
    | ... 
    ; 

eval_expression (중첩 평가, 논리 표현 등과 같은 기능) 매우 복잡하고, 나는 eval_expression의 내용을 상관하지하지합니까 너무 많은 노력을 들여 파싱하려고합니다. 위의 문법에서 stats_function 이름과 같은 다른 정보 만 얻고 싶습니다.

내 질문은 내가 eval_expression에 대한 전체 렉서/문법 사양을 작성하지 않고 전체 eval_expression과 쉽게 일치하도록 일부 와일드 카드 일치를 수행 할 수있는 Jison의 방법이 있습니까?

참고 : 위의 코드에서 other_stats_aggregation 부분을 구문 분석해야하므로이 작업을 수행하기 위해 Jison 대신 일반 표현식을 사용하는 것과 같은 해결 방법이 작동하지 않습니다. 전체 문법/구문 분석기를 작성합니다.

도움을 주시면 감사하겠습니다.

답변

1

eval_expression을 다른 용도 (즉, expression의 일부가 아님)로 완전히 구문 분석 할 필요가 없다고 가정하면 표현식이 종료되는 곳만 알아야합니다. 그것은 괄호를 균형 것으로 가정 아마 합리적인, 그래서 그것은 같은으로 인식 할 수 괄호 균형 토큰의 순서에 걸쳐됩니다 balanced_paren_object 가능한 RHS의 목록에있는 모든 토큰이 포함됩니다

balanced_paren_sequence: 
         | balanced_paren_sequence balanced_paren_object 
         ; 

/* Since jison has no wild cards, you need this complete list */ 
balanced_paren_object: '(' balanced_paren_sequence ')' 
         | '+' | '-' | '*' | '/' | ... 
         | `[` | `]` | '{' | '}' | ... 
         | IDENTIFIER | CONSTANT | ... 
         ; 

을 귀하의 언어는 ()입니다. 도시 된 바와 같이, 그것은 다른 평형 쌍을 포함 [/]{/ } 등을들 수있다.

balanced_paren_object의 첫 번째 프로덕션과 유사한 규칙을 추가하여 균형을 조정할 수도 있지만 오류보고를 향상시키는 데 유용합니다. 서면에 따르면, 파서는 불균형 괄호가 포함 된 잘못된 구문을 허용하지만 자세한 파싱을 수행하지 않으므로 구문 분석기는 특정 잘못된 구문을 받아들이게됩니다.

당신은 (그 자세한 구문 분석 트리 필요하지 않은 표현의 한 종류가있는 경우 그 비 터미널의 이름으로 eval_expression을 사용할 수 있습니다, 참과) balanced_paren_sequencebalanced_paren_object의 정의를 인라인 할 수; 위와 같이 읽을 수있는 모호한 시도로 썼습니다.

+0

이전에이 접근법을 생각했지만이 방법으로 모든 토큰에 대해 두 개의 목록을 유지해야하기 때문에이 방법이 나에게 '쉽지 않은'것으로 들리지 않았습니다. 다른 대안이 없다고 생각합니다. 고마워요. – nybon