2014-01-21 2 views
0

에 브래킷을 일치하는 방법, 내가 예를 들어, 쌍 브래킷을 일치하는 방법을 알고 :는 LALR (1) 파서 YACC

expr: /* empty */ 

     | '(' expr ')' 
     ; 

는 다음과 같은 입력과 일치 할 수

((())) 

을하지만,

((() ()) () (() () ())) 

이 큰 페어의 BRACKE 내부의 여러 쌍 괄호가 의미 : 나는이 같은 입력과 일치하는 규칙을 작성하는 방법을 잘 모르겠습니다 t는 같은 레벨에 입니다. 다음과 같은 간단한 예가 하나 있습니다.

(() ()) 

중첩 대괄호가 여러 개 있다고 가정하고 규칙을 작성하는 방법은 무엇입니까? 의 +에 표시된 것처럼 당신이 (다른 표현이없는 경우

expr: /* empty */ 
    | expr '+' expr 
    | ... 
    | list-expr 

list-expr: '(' expr ')' 
     | list-expr '(' expr ')' 

: 당신을 가정

답변

1

은 그때는 아마 그 목적을 위해 하위 표현을 할 것 혀짤배기 목록과 비슷한보고있다 여기 내 예제) 다음 별도의 규칙이 필요하지 않습니다. 아마 식으로 정의 된 함수 호출을 가지고에서 당신을 방지 할 수

참고 :

expr: IDENTIFIER '(' expr ')' 
+0

감사 :

expr: expr '(' expr ')' // C-like function call not compatible 

당신은 여전히 ​​같은 식별자 통화를 할 수있다. 이것은 많은 도움이됩니다. – user3220866

관련 문제