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を呼んでいるものを命名するために他のいくつかの単語を見つける)、および括弧内の条件にすべての問題が消えます。

この問題に対処する他にも数多くの質問があります。ここではいくつかある:

+0

あなたは電子たいとき以来、間違ってこのアプローチではありませんxpressionパーサーは条件も受け入れることができます。例えば、 。値割当の場合:id = expr; またはそれを@セマンティック分析で処理する必要がありますか? –

+1

@AlexF:それは、2つの条件が式として使用されていることを示す例を含めて、Cについての私の指摘でした。それをCのようにしたくない場合は、別の戦略が必要ですが、リンクされたいくつかの質問に示されているように、reduceアクションのセマンティックチェックで行うのが最も簡単です。 (また、あなたはCのようにしたいと言ってはいけません:-)) – rici