2013-02-11 2 views
0

저는 LAM이라고 부르는 모델 용 파서를 생성하기 위해 SableCC를 사용하려고합니다. 자체 LAM은 간단하고, 이들에 대한 (나는 많은 것들을 생략) 간단한 문법은 다음과 같습니다 문법의 연관성 스키마 변경

L := 0 | (x,y) | F(x1,...,xn) | L || L | L ; L 

내가이 문법 쓴 :

Helpers 
    number = ['0' .. '9'] ; 
    letter = ['a' .. 'z'] ; 
    uletter = ['A' .. 'Z'] ; 

Tokens 
    zero  = '0' ; 
    comma = ',' ; 
    parallel = '||' ; 
    point = ';' ; 
    lpar = '(' ; 
    rpar = ')' ; 

    identifier = letter+ number* ; 
    uidentifier = uletter+ number* ; 

Productions 
    expr = {term} term | 
      {parallel} expr parallel term | 
      {point} expr point term; 

    term = {parenthesis} lpar expr rpar | 
      {zero} zero | 
      {invk} uidentifier lpar paramlist rpar | 
      {pair} lpar [left]:identifier comma [right]:identifier rpar ; 

    paramlist = {list} list | 
       {empty} ; 

    list = {var} identifier | 
      {com} identifier comma list ; 

이 기본적으로 작동을하지만,이 부작용 : 왼쪽 연관입니다. 나는 그런

L = L1 || L2 ; L3 || L4 

이있는 경우 예를 들어,이 같은 구문 분석됩니다 :

L = ((L1 || L2) ; L3) || L4 

내가 모든 우선 순위를 부여 할 ";" 운영자, 그래서 L이

L = (L1 || L2) ; (L3 || L4) 

같은 구문 분석했다 ("||"와 같은 다른 것들, 수는 남아 연관 왼쪽)

내 질문은 :

  1. 이 할 수있는 팁이 있습니다 그러한 변환은 "자동화 된"방식으로 수행됩니까?
  2. ";"에있는 모든 우선 순위의 문법이 될 수있는 방법은 무엇입니까? ? 또한 "RTFM 링크"를 수락

은 - D 는 당신에게 당신이 원하는 연산자 우선 순위와 일치 규칙의 계층 구조를 만드는 데 필요한 모든

답변

0

감사드립니다.

expr = {subexp} subexp | 
     {parallel} subexp parallel expr ; 

subexp = {term} term | 
     {point} term point subexp; 

또한 연관성을 변경했습니다.

+0

유용합니다. 따라서 기본적으로 우선 순위가 더 높은 연산자가 해당 계층 위에 위치하는 계층 구조를 만들어야합니다. – kronat

+0

@kronat * 우선 순위가 *보다 낮은 연산자는 계층 구조에서 위쪽에 위치합니다. – Apalala