- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Windows 上使用 FLEX 构建一个词法分析器。
我总是收到一个错误:
"undefined reference to `yylval'"
extern
键入所有定义如下:
%option noyywrap
%{
#include<stdio.h>
#include<stdlib.h>
#include "tokens.h"
int nline = 1;
int size_token_array = 100;
int number_of_tokens_in_array = 0;
int inc_token_array = 50;
token *token_store ;
extern yylval;
%}
delim [ \t]
delim_nl [\n]
ws {delim}+
nl {delim_nl}+
letter [a-z]
digit [0-9]
id {letter}(letter.digit)*
int_num (0|([+-]?([1-9]{digit}*)))
real_num [+-]?{digit}+(\.{digit}+)
rel_op ">"|"<"|"<="|">="|"=="|"!="
binary_ar_op "+"|"-"|"*"|"/"|"="
task_id {letter}(letter+digit)*
signal_id {letter}(letter+digit)*
%%
"parbegin" {create_and_store_token(TOKEN_PARBEGIN,yytext,nline); return 1;}
"parend" {create_and_store_token(TOKEN_PAREND,yytext,nline); return 1;}
"task" {create_and_store_token(TOKEN_TASK,yytext,nline); return 1;}
"{" {create_and_store_token('{',yytext,nline); return 1;}
"}" {create_and_store_token('}',yytext,nline); return 1;}
"begin" {create_and_store_token(TOKEN_BEGIN,yytext,nline); return 1;}
"end" {create_and_store_token(TOKEN_END,yytext,nline); return 1;}
"integer" {create_and_store_token(TOKEN_INTEGER,yytext,nline); return 1;}
"real" {create_and_store_token(TOKEN_REAL,yytext,nline); return 1;}
"||" {create_and_store_token(TOKEN_PARALLEL,yytext,nline); return 1;}
";" {create_and_store_token(';',yytext,nline); return 1;}
"," {create_and_store_token(',',yytext,nline); return 1;}
"do" {create_and_store_token(TOKEN_DO,yytext,nline); return 1;}
"until" {create_and_store_token(TOKEN_UNTIL,yytext,nline); return 1;}
"od" {create_and_store_token(TOKEN_OD,yytext,nline); return 1;}
"send" {create_and_store_token(TOKEN_SEND,yytext,nline); return 1;}
"accept" {create_and_store_token(TOKEN_ACCEPT,yytext,nline); return 1;}
"(" {create_and_store_token('(',yytext,nline); return 1;}
")" {create_and_store_token(')',yytext,nline); return 1;}
"<" {create_and_store_token(LT,yytext,nline); yylval=rel_op; return 1;}
">" {create_and_store_token(GT,yytext,nline); yylval=rel_op; return 1;}
"<=" {create_and_store_token(LE,yytext,nline); yylval=rel_op; return 1;}
">=" {create_and_store_token(GE,yytext,nline); yylval=rel_op; return 1;}
"==" {create_and_store_token(EQ,yytext,nline); yylval=rel_op; return 1;}
"!=" {create_and_store_token(NE,yytext,nline); yylval=rel_op; return 1;}
"*" {create_and_store_token('*',yytext,nline); yylval=binary_ar_op; return 1;}
"/" {create_and_store_token('/',yytext,nline); yylval=binary_ar_op; return 1;}
"+" {create_and_store_token('+',yytext,nline); yylval=binary_ar_op; return 1;}
"-" {create_and_store_token('-',yytext,nline); yylval=binary_ar_op; return 1;}
"=" {create_and_store_token('=',yytext,nline); yylval=binary_ar_op; return 1;}
{ws} ;
{nl} nline++;
id {create_and_store_token(TOKEN_ID,yytext,nline); return 1;}
int_num {create_and_store_token(TOKEN_INT_NUM,yytext,nline); return 1;}
real_num {create_and_store_token(TOKEN_REAL_NUM,yytext,nline); return 1;}
binary_ar_op {create_and_store_token(TOKEN_AR_OP,yytext,nline); return 1;}
"task_id" {create_and_store_token(TOKEN_TASK_ID,yytext,nline); return 1;}
"signal_id" {create_and_store_token(TOKEN_SIGNAL_ID,yytext,nline); return 1;}
%%
int main()
{
token_store = (token*)calloc(size_token_array,sizeof(token));
free(token_store);
return 0;
}
void create_and_store_token(int token_type,char* token_lexeme,int line_number){
token new_token;
new_token.ivalue = token_type;
new_token.lexema = token_lexeme;
new_token.line_number = line_number;
if(size_token_array == (number_of_tokens_in_array-10)){
token_store = (token*)realloc(token_store,inc_token_array*sizeof(token));
size_token_array+=inc_token_array;
number_of_tokens_in_array++;
token_store[number_of_tokens_in_array]= new_token;
}
else{
token_store[number_of_tokens_in_array]= new_token;
number_of_tokens_in_array++;
}
}
int nextToken(){
return yylex();
}
void backToken(){
token_store[number_of_tokens_in_array].ivalue = 0;
token_store[number_of_tokens_in_array].lexema = "";
token_store[number_of_tokens_in_array].line_number = 0;
number_of_tokens_in_array--;
}
最佳答案
extern yylval;
意味着 yylval
在其他地方定义。所以你必须这样做。
通常它是在yacc/bison 生成的解析器中定义的,因此在链接扫描器和解析器时可以解析名称。如果您不使用 bison/yacc,则必须定义 yylval
你自己。 (如果你真的需要它。你的代码没有给出你需要什么的太多提示。)
顺便说一句,您的代码还有许多其他问题。一个特别明显的就是不能使用指针yytext
的值。在扫描仪移动到下一个 token 之后。如果您需要 yytext
指向的字符串的持久副本,您需要制作自己的副本(并在不再需要时释放为副本分配的内存。)
您的许多正则表达式也是不正确的。宏使用(“定义”)必须用大括号括起来,所以
id {create_and_store_token(TOKEN_ID,yytext,nline); return 1;}
{id}
是一个开始,
id
的定义也不正确。
letter
的定义只包含小写字母,对于阅读您的代码的人来说根本不明显。最好使用 Posix 字符类,它不需要定义并且其含义是明确的:
[[: alpha:]]
对于字母,
[[:lower:]]
对于小写字母,
[[:alnum:]]
用于字母或数字等。
关于flex-lexer - 如何在 flex 中使用 yylval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43396132/
我正在尝试从 https://github.com/antlr/grammars-v4/tree/master/mysql 处的 MySQL .g4 文件构建解析器和词法分析器。 。我收到错误“词法分
我正在学习 ANTLR4 并尝试使用词汇模式。如何让相同的标记出现在多个词法模式中?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,例如我怎么能不以 WS_MODE1
我有一个扫描仪dice notation 使用以下扫描器 %option debug %option noyywrap %option yylineno %{ #include #includ
默认情况下,flex使用最长匹配规则。 有什么方法可以覆盖此行为以使其与最短序列匹配? 谢谢 最佳答案 Flex手册中的This page表示它没有任何非贪婪的运算符,因为它是扫描程序而不是解析程序,
我正在为tcpdump日志编写一个简单的解析器,能否请您告诉我为什么我无法获得正确的行号? %{ char str[80]; %} %option yylineno ... %% ^{HOURS}:{
我想在flex中制定一条规则,以使用像/ * * /这样的c样式注释 我有以下 c_comment "/*"[\n.]*"*/" 但是它永远不会匹配。知道为什么吗?如果您需要更多我的代码,请告诉我,我
解析数字和字符串是词法分析器的工作吗? 考虑到我在询问词法分析器是否应该解析输入这一事实,这可能听起来也可能不愚蠢。但是,我不确定这实际上是词法分析器的工作还是解析器的工作,因为为了正确地进行词法分析
我想为嵌套 block 语法编写一个简单 解析器,只是分层纯文本。例如: Some regular text. This is outputted as-is, foo{but THIS is ins
正在使用编译器,我想打印出符号表。我有一个节点结构,我需要访问全局变量“lineCount”。当我尝试在 idPush 函数中打印它时,出现段错误。我的目标是将节点放置在数组中或链接在一起,然后打印表
我正在寻求有关自定义构建的 Lexer 类并使用它来解析输入的帮助。我们的教授为我们的项目提供了一些框架代码,我们必须使用它。我的问题是,我们需要能够一次调用多个函数来对表进行排序和合并/排序单独表的
我正在尝试用 C# 编写一个非常简单的解析器。 我需要一个词法分析器——它可以让我将正则表达式与标记相关联,因此它会读取正则表达式并返回符号。 似乎我应该能够使用 Regex 来完成实际的繁重工作,但
我正在尝试使用 Antlr 4.7 创建具有多种模式的词法分析器。我的词法分析器目前是: ACTIONONLY : 'AO'; BELIEFS : ':Initial Beliefs:' ->
似乎有时 Antlr 词法分析器在标记字符流时对使用哪个规则做出了错误的选择......我试图弄清楚如何帮助 Antlr 做出显而易见的正确选择。我想像这样解析文本: d/dt(x)=a a=d/dt
这是八进制值的示例规则。我不想使用 YYTEXT,而是在结尾处获取值、字母和 # (8,...64)。我怎样才能得到它们?我猜 printf("%s", $1) 来看看我是否能得到这个值,但 lex
这种语法之间有什么区别: ... if_statement : 'if' condition 'then' statement 'else' statement 'end_if'; ... 和这个:
我使用 flex 在扫描仪上工作,将 \" 替换为 ";和 \\ 与 \。 所以我的代码是这样的 %% \\" \"; \\\ \\; 但是当我编译时,我收到一条错误消息,如 missin
根据manual YY_BUF_SIZE 是 16K 我们需要覆盖它。但是,手册没有指定如何覆盖它,我也找不到任何命令行选项。有人可以指出如何更改此设置。在生成的源代码中,YY_BUF_SIZE定义如
我有一个简单的“语言”,我正在使用 Flex(词法分析器),如下所示: /* Just like UNIX wc */ %{ int chars = 0; int words = 0; int lin
我正在使用 flex (词法分析器,而不是 Adobe Flex)在一个项目上。但是,我也希望能够在 Windows 平台上进行编译,但是 Windows version的最新版本只有 2.5.4
当我在 CMD 提示符下运行 .jar 文件时,出现以下错误: C:\Users\Mikael\My Documents\NetBeansProjects\cs413CompilerProject\d
我是一名优秀的程序员,十分优秀!