【发布时间】:2016-02-28 20:31:02
【问题描述】:
我尝试使用bisonc++ 编写一个基本的语法检查器
规则是:
expression -> OPEN_BRACKET expression CLOSE_BRACKET
expression -> expression operator expression
operator -> PLUS
operator -> MINUS
如果我尝试运行编译后的代码,我会在这一行得到一个错误:
(a+b)-(c+d)
应用第一条规则,最左边和最右边的括号是OPEN_BRACKET 和CLOSE_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 [ \t\n]
%%
{CHAR}+ return Parser::VARIABLE;
"+" return Parser::PLUS;
"-" return Parser::MINUS;
"(" return Parser::OPEN_BRACKET;
")" return Parser::CLOSE_BRACKET;
【问题讨论】:
-
有,但这只是相关部分
-
这是你第一次想到的,你错了。您应该提供一个展示问题的最小但完整的示例。
标签: c++ flex-lexer bisonc++