在 bisonc++ 中正确接受括号

Accept brackets correctly in bisonc++

本文关键字:bisonc++      更新时间:2023-10-16

我尝试使用bisonc++编写一个基本的语法检查器

规则是:

expression -> OPEN_BRACKET expression CLOSE_BRACKET
expression -> expression operator expression
operator -> PLUS
operator -> MINUS

如果我尝试运行编译后的代码,则在此行出现错误:

(a+b)-(c+d)

应用第一条规则,最左边和最右边的括号是OPEN_BRACKETCLOSE_BRACKET。其余expression为:a+b)-(c+d

如何防止这种行为?是否可以计算左括号和右括号?


编辑

表达式语法:

expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }        
| operator
    {
        //
    }        
| VARIABLE
    {
        //
    }
;

operator:
    expression PLUS expression
    {
        //
    }
| expression MINUS expression
    {
        //
    }
;

编辑2

词法分析器

CHAR  [a-z]
WS    [ tn]
%%
{CHAR}+     return Parser::VARIABLE;
"+"         return Parser::PLUS;
"-"         return Parser::MINUS;
"("         return Parser::OPEN_BRACKET;
")"         return Parser::CLOSE_BRACKET;

这不是正常的表达语法。尝试普通的。

expression
    : term
    | expression '+' term
    | expression '-' term
    ;
term
    : factor
    | term '*' factor
    | term '/' factor
    | term '%' factor
    ;
factor
    : primary
    | '-' factor // unary minus
    | primary '^' factor // exponentiation, right-associative
    ;
primary
    : identifier
    | literal
    | '(' expression ')'
    ;

另请注意上述缩进和对齐方法,并且您只需从词法分析器返回单个特殊字符的yytext[0]:您不需要特殊的标记名称,并且没有它们更具可读性:

CHAR [a-zA-Z]
DIGIT [0-9]
WHITESPACE [ trn]
%%
{CHAR}+       { return Parser::VARIABLE; }
{DIGIT}+      { return Parser::LITERAL; }
{WHITESPACE}+ ;
.             { return yytext[0]; }

您的运算符规则看起来不太好。

尝试尝试:

expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }
|
    expression operator expression
    {
        //
    }
|
    VARIABLE
    {
        //
    }
;

operator:
    PLUS
    {
        //
    }
|
    MINUS
    {
        //
    }
;

正如您的伪代码实际上建议的那样...