条件 - 解析语法SableCC

时间:2017-05-16 19:06:32

标签: parsing grammar ambiguous sablecc

我正在使用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
        ;

1 个答案:

答案 0 :(得分:2)

如果你真的想接受“像C一样”的条件,那么你只需要将你的条件作为expr的另一种形式,因为它们就是这样:它们是表达式,其值始终存在于范围{0, 1}。但它们没有其他区别:

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

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

因此,如果您只是将上一个factor制作更改为lparen cond rparen(或将cond重命名为expr,并找到其他一些词来命名您当前正在调用的内容{{ 1}}),括号条件的所有问题都将消失。

还有许多其他SO问题可以解决这个问题。以下是一些: