gpt4 book ai didi

c++ - 在 bisonc++ 中正确接受括号

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:51 24 4
gpt4 key购买 nike

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

规则是:

expression -> OPEN_BRACKET expression CLOSE_BRACKET
expression -> expression operator expression

operator -> PLUS
operator -> MINUS

如果我尝试运行编译后的代码,我会在这一行收到错误:

(a+b)-(c+d)

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

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


编辑

表达式语法:

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

;


operator:
expression PLUS expression
{
//
}

| expression MINUS expression
{
//
}

;

编辑2

词法分析器

CHAR  [a-z]
WS [ \t\n]

%%

{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 [ \t\r\n]
%%
{CHAR}+ { return Parser::VARIABLE; }
{DIGIT}+ { return Parser::LITERAL; }
{WHITESPACE}+ ;
. { return yytext[0]; }

关于c++ - 在 bisonc++ 中正确接受括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35687891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com