野牛不符合规则



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

Flex 完全匹配词法规则,并识别括号、数字、标识符和不允许的字符。但是 Bison 在遇到语法规则时什么都不做。所以我不明白为什么野牛不激活

这是我的词法分析器文件(lexicon.l(:

%option noyywrap
%option nodefault
%{
#include <stdio.h>
#include "grammar.tab.h"
%}
digit   [0-9]
letter  [a-zA-Z]
%%
[ tn]     { ; }
^{letter}({letter}|{digit})*    { printf("IDENTIFIERn"); return IDENTIFIER; }
{digit}+    { printf("NUMBERn"); return NUMBER; }
(      { printf("OPEN_PARENHESISn"); return OPEN_PARENTHESIS; }
)      { printf("CLOSE_PARENTHESISn"); return CLOSE_PARENTHESIS; }
.       { printf("lexical errorn"); 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, "%sn", s);
}

这是我的制作文件

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函数,而是链接来自libl的函数。那个只在循环中调用yylex()- 它不调用yyparse().

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

最新更新