Bison 语法错误处理
Bison syntax error handling
我最近开始研究 bison 解析器,
下面是解析器文件的一部分,将在循环中执行。
Program: Start statement Stop
{
...
...
...
}
如果出现任何语法错误,如何跳过当前案例的执行
在声明部分?并再次循环执行?
Program: Start statement Stop
{
I want to skip execution of this part ..if any syntax error occurs in
any of the rule section ( Start, statement and Stop)
}
我尝试添加如下错误规则,但它没有按预期工作。
Program: Start statement Stop
{
....
...
...
}
| Program error Stop (// skip until Stop)
{
yyerrok;
}
在这种情况下,处理语法错误的正确方法是什么?并继续解析?
此处需要帮助。
我不确定我是否真的理解您的需求,但类似下面的内容应该可行:
test_cases : %empty
| test_cases test_case
test_case : START statements STOP
| error STOP { yyerrok; }
这不是很复杂;特别是,如果在 START
和 STOP
之间有令牌,并且对丢失的 STOP
令牌的处理不是最优的,将会产生不幸的后果。 (理想的解决方案是在 START
令牌上也重新同步,但是你必须安排扫描器再次发送 START
令牌,这很丑陋。)
我最近开始研究 bison 解析器, 下面是解析器文件的一部分,将在循环中执行。
Program: Start statement Stop
{
...
...
...
}
如果出现任何语法错误,如何跳过当前案例的执行 在声明部分?并再次循环执行?
Program: Start statement Stop
{
I want to skip execution of this part ..if any syntax error occurs in
any of the rule section ( Start, statement and Stop)
}
我尝试添加如下错误规则,但它没有按预期工作。
Program: Start statement Stop
{
....
...
...
}
| Program error Stop (// skip until Stop)
{
yyerrok;
}
在这种情况下,处理语法错误的正确方法是什么?并继续解析?
此处需要帮助。
我不确定我是否真的理解您的需求,但类似下面的内容应该可行:
test_cases : %empty
| test_cases test_case
test_case : START statements STOP
| error STOP { yyerrok; }
这不是很复杂;特别是,如果在 START
和 STOP
之间有令牌,并且对丢失的 STOP
令牌的处理不是最优的,将会产生不幸的后果。 (理想的解决方案是在 START
令牌上也重新同步,但是你必须安排扫描器再次发送 START
令牌,这很丑陋。)