0

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

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
        ;
4

1 回答 1

2

如果您真的打算接受“像 C 中一样”的条件,那么您只需将条件设置为另一种形式expr,因为它们就是这样:它们是表达式,其值恰好总是在 range 中{0, 1}。但它们在其他方面并没有什么不同:

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

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

因此,如果您只是将最后一个factor产生式更改为lparen cond rparen(或重命名condexpr并找到其他单词来命名您当前正在调用的内容expr),那么括号条件的所有问题都会消失。

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

于 2017-05-16T22:05:49.903 回答