条件——解析文法SableCC

Conditions - parsing grammar SableCC

我正在使用 sableCC 并尝试构建一个接受条件的语法 C.However 当我尝试在我的条件中添加括号时出现错误,因为与我的括号有冲突有为表达。 例如它接受 4 = 3 或 x = 95 mod 5 和 5 = 5 但没有任何 parentheses.Also 我觉得 'not' 语法规则不正确。

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
        ;

如果您真的想接受条件 "like in C",那么您只需将条件设为 expr 的另一种形式,因为它们就是这样:它们是表达式,其值恰好总是在 {0, 1} 范围内。但它们在其他方面没有什么不同:

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

是一个完全可以接受的表达式(尽管它可能不会经常出现在 C 程序中)。

因此,如果您只是将最后一个 factor 作品更改为 lparen cond rparen(或将 cond 重命名为 expr 并找到其他词来命名您当前调用的作品expr), 括号条件问题全部消失

还有许多其他 SO 问题可以解决此问题。这里有一些:

  • How to remove shift/reduse warning?

  • reduce/reduce conflicts using ocamlyacc