首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确接受bisonc++中的括号

正确接受bisonc++中的括号
EN

Stack Overflow用户
提问于 2016-02-28 20:31:02
回答 2查看 89关注 0票数 0

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

这些规则是:

代码语言:javascript
复制
expression -> OPEN_BRACKET expression CLOSE_BRACKET
expression -> expression operator expression

operator -> PLUS
operator -> MINUS

如果我试图运行编译后的代码,在这一行中会出现一个错误:

代码语言:javascript
复制
(a+b)-(c+d)

第一个规则被应用,最左边和最右边的括号是OPEN_BRACKETCLOSE_BRACKET。剩下的expression是:a+b)-(c+d

如何才能防止这种行为?是否可以计算开括号和封闭括号?

编辑

语法表达式:

代码语言:javascript
复制
expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }        
| operator
    {
        //
    }        
| VARIABLE
    {
        //
    }

;


operator:
    expression PLUS expression
    {
        //
    }

| expression MINUS expression
    {
        //
    }

;

Edit2

雷克萨斯

代码语言:javascript
复制
CHAR  [a-z]
WS    [ \t\n]

%%

{CHAR}+     return Parser::VARIABLE;

"+"         return Parser::PLUS;
"-"         return Parser::MINUS;

"("         return Parser::OPEN_BRACKET;
")"         return Parser::CLOSE_BRACKET;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-28 20:48:20

这不是一个正常的表达式语法。试试普通的。

代码语言:javascript
复制
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 ')'
    ;

还请注意上面的缩进和对齐方法,您只需从lexer返回单个特殊字符的yytext[0]:您不需要特殊的令牌名称,没有它们更容易读到:

代码语言:javascript
复制
CHAR [a-zA-Z]
DIGIT [0-9]
WHITESPACE [ \t\r\n]
%%
{CHAR}+       { return Parser::VARIABLE; }
{DIGIT}+      { return Parser::LITERAL; }
{WHITESPACE}+ ;
.             { return yytext[0]; }
票数 4
EN

Stack Overflow用户

发布于 2016-02-28 21:30:31

您的操作员规则看起来不太好。

试试看:

代码语言:javascript
复制
expression:
    OPEN_BRACKET expression CLOSE_BRACKET
    {
        //
    }

|

    expression operator expression
    {
        //
    }

|

    VARIABLE
    {
        //
    }

;


operator:
    PLUS
    {
        //
    }

|

    MINUS
    {
        //
    }
;

正如你的伪代码所暗示的..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35687891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档