2017-05-16 14 views
0

나는 sableCC를 사용하고 있으며 C와 같은 조건을 허용하는 문법을 만들려고합니다. 괄호와 충돌하기 때문에 조건에 괄호를 추가하려고 할 때 오류가 발생합니다. 나는 표정을 가지고있다. 예 : 4 = 3 또는 x = 95 mod 5와 5 = 5를 허용하지만 괄호는 사용하지 않습니다. 또한 'not'문법 규칙이 맞지 않는 것처럼 느낍니다.조건 - 구문 문법 SableCC

Helpers 
    tab = 9; 
    cr = 13; 
    lf = 10; 

    sign = '+' | '-'; 
    digit = ['0'..'9']; 

    lowercase = ['a'..'z']; 
    uppercase = ['A'..'Z']; 
    letter = lowercase | uppercase; 
    idletter = letter | '_'; 
    idchar = letter | '_' | digit; 

Tokens 
    number = [digit - '0'] digit*; 
    id = idletter idchar*; 
    plus = '+'; 
    minus = '-'; 
    times = '*'; 
    div = 'div'; 
    mod = 'mod'; 

    equal = '='; 
    hash = '#'; 
    greater = '>'; 
    greateq = '>='; 
    less = '<'; 
    lesseq = '<='; 
    not = 'not'; 
    and = 'and'; 
    or = 'or'; 

    lparen = '('; 
    rparen = ')'; 

    eol = cr | lf | cr lf; 
    blank = ' ' | tab; 

Ignored Tokens 

    eol, blank; 

Productions 

    program = compare*; 

expr = {term} term 
     | {add} expr plus term 
     | {sub} expr minus term 
     ; 
term = {factor} factor 
     | {times} term times factor 
     | {div} term div factor 
     | {mod} term mod factor 
     ; 
factor = {number} number 
     | {id} id 
     | {expr} lparen expr rparen 
     ; 

compare = {cond} cond | 
      {gr}compare greater cond | 
      {gq}compare greateq cond | 
      {ls}compare less cond | 
      {lq}compare lesseq cond | 
      {eq}compare equal cond | 
      {not} not cond 
      ; 

cond = {expr} expr | 
     {and} cond and expr | 
     {or} cond or expr 
     ; 

답변

2

당신은 정말 그들이 무엇 때문에, 당신은 당신의 조건 expr의 또 다른 형태를 만들 것입니다, "C처럼"약관에 동의하는 것을 의미하는 경우 : 그들은 표현 값이 항상에 될 일이 있습니다 범위 {0, 1}. 그러나 그들은 다르게 다르지 않습니다 :

a = (x < y) + 3 * (x == z || x < 6); 

은 완벽하게 수용할만한 표현입니다 (C 프로그램에서는별로 자주 나타나지 않지만).

그래서 당신은 lparen cond rparen 마지막 factor 생산을 변경 (또는 expr 같은 cond 이름을 변경하고 현재 expr를 호출 어떤 이름을 몇 가지 다른 단어를 찾을 수 있습니다), 그리고 괄호로 조건에 모든 문제가 사라집니다 경우.

이 문제를 해결하는 많은 다른 SO 질문이 있습니다. 여기에 몇 가지 있습니다 :

+0

는 전자 원할 때마다부터 잘못이 방법이 없습니다 xpression 파서도 조건을 받아 들일 수 있습니다. 예. 값 할당 : id = expr; 또는 @ 그것을 의미 론적 분석으로 처리해야합니까? –

+1

@AlexF : 그것은 두 개의 조건이 표현식으로 사용되는 것을 보여주는 예제를 포함하여 C에 관한 저의 요점이었습니다. C와 같지 않으려면 다른 전략이 필요하지만 (링크 된 몇 가지 질문에 표시되어 있듯이) 줄이기 작업에서 의미 론적 검사를 사용하면 가장 쉬운 방법입니다. (C :-)와 같이하고 싶다고해서는 안된다.) – rici