【问题标题】:parser for expressions in lex/yacclex/yacc 中的表达式解析器
【发布时间】:2013-12-07 20:56:25
【问题描述】:

我正在尝试根据这些规则解析语句以查看它们是否有效:

任务: id = exp ;

表达式: id op id {op id}

id是数字和char的组合,第一个位置是char。

当我的 in.txt 文件中有类似内容时出现语法错误:hello = three3

但这不应该是语法错误,然后当我输入类似:hello = =

不显示语法错误,但应该。我做错了什么?

莱克斯:

%{
#include "y.tab.h"
#include <stdio.h>
%}
%%
[ \t\n]+                ;
[a-zA-Z][a-zA-Z0-9]*    {
                        ECHO;
                        return ID;
                    }
%%

YACC:

%{
#include <stdio.h>
extern FILE * yyin;
%}
%token ID

%left '+' '-'
%left '*' '/' '%'
%right ';'

%%
assignment: expression
        |
        ID '=' expression
        ;

expression: ID
        |
        expression '*' expression
        |
        expression '/' expression
        |
        expression '%' expression
        |
        expression '+' expression
        |
        expression '-' expression
        |
        '(' expression ')'
        ;
%%
int main(void) {
yyin = fopen("in.txt", "r");
yyparse();
fclose(yyin);
return 0;
}

【问题讨论】:

    标签: parsing expression yacc lex


    【解决方案1】:

    我不能只看这个,但一个很好的发现方法是在环境变量 YYDEBUG 为 1 时运行解析器,就像在 (unix) 中一样:

    YYDEBUG=1 ./a.out 
    

    您应该获得解析器执行的步骤以及它从词法分析器接收到的标记的详细列表(在大多数情况下,错误是在您的示例中,例如:解析器如何获得“=”符号和运营商?)。将此与运行 yacc -v 时获得的 y.output 文件进行比较

    【讨论】:

    • 是的,现在我定义了运算符,似乎可以工作了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多