野牛与规则不符

问题描述 投票:1回答:1

我想为自己的简单编程语言创建一个简单的编译器。因此,我使用Flex和Bison。

Flex完全匹配词汇规则,并识别括号,数字,标识符和不允许的字符。但是当遇到语法规则时,Bison不会执行任何操作。所以我不明白为什么野牛不激活

这里是我的词典文件(lexicon.l):

%option noyywrap
%option nodefault

%{

#include <stdio.h>
#include "grammar.tab.h"
%}

digit   [0-9]
letter  [a-zA-Z]

%%

[ \t\n]     { ; }
^{letter}({letter}|{digit})*    { printf("IDENTIFIER\n"); return IDENTIFIER; }
{digit}+    { printf("NUMBER\n"); return NUMBER; }
\(      { printf("OPEN_PARENHESIS\n"); return OPEN_PARENTHESIS; }
\)      { printf("CLOSE_PARENTHESIS\n"); return CLOSE_PARENTHESIS; }
.       { printf("lexical error\n"); exit(0); }

%%

这里是我的解析器文件(grammar.y):

%{
void yyerror(char *s);
#include <stdio.h>  
%}

%token NUMBER IDENTIFIER OPEN_PARENTHESIS CLOSE_PARENTHESIS
%start File

%%

File
:   %empty
|   Function File
;

Function
:   IDENTIFIER OPEN_PARENTHESIS CLOSE_PARENTHESIS   { printf("fn"); }
;

%%

void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}

这是我的makefile

iconv --from-code UTF-8 --to-code US-ASCII -c grammar > grammar.y

bison -d grammar.y

flex lexicon.l

cc -ll grammar.tab.c lex.yy.c

当我输入“ blabla()”作为简单功能时,它不会激活。

syntax compiler-construction bison
1个回答
1
投票

您的解析器根本没有运行。

您没有定义main函数,而是链接了libl中的一个。仅循环调用一个yylex()-不调用yyparse()

相反,您应该定义自己的main函数,该函数可以仅包含一次对yyparse()的调用。

© www.soinside.com 2019 - 2024. All rights reserved.