野牛不符合规则
Bison does not match the rule
我想为我自己的简单编程语言制作一个简单的编译器。因此我使用 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 ()" 作为一个简单的函数时它没有激活。
您的解析器根本就不是 运行。
您没有定义 main
函数,而是 link 来自 libl
的函数。那个只在循环中调用 yylex()
- 它不调用 yyparse()
.
相反,您应该定义自己的 main
函数,它可以简单地包含对 yyparse()
.
的一次调用
我想为我自己的简单编程语言制作一个简单的编译器。因此我使用 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 ()" 作为一个简单的函数时它没有激活。
您的解析器根本就不是 运行。
您没有定义 main
函数,而是 link 来自 libl
的函数。那个只在循环中调用 yylex()
- 它不调用 yyparse()
.
相反,您应该定义自己的 main
函数,它可以简单地包含对 yyparse()
.