【发布时间】:2023-01-14 13:46:43
【问题描述】:
我们被要求使用 FLEX 软件并且必须用 C 编写代码。 第一个字符串是从文本文件中收集的,这就是我在 LEX 中的做法:
%option noyywrap yylineno
%{
#define YYSTYPE char *
#include "y.tab.h"
%}
%%
[ \t\n]+ {}
"NAZIV" {return _NAZIV;}
"GODINA" {return _GODINA;}
"TIP" {return _TIP;}
"ECTS" {return _ECTS;}
":" {return _DVOTACKA;}
";" {return _SEMICOLON;}
[A-Za-z]+ {yylval=strdup(yytext); return _VRIJEDNOST;}
[0-9]+ {yylval =atoi(yytext); return _BROJ_BODOVA;}
所以我需要在倒数第二行收集一个任意字符串 [A-Za-z]+ 。 现在在 Yacc 中,如果文本文件在该位置显示“obavezni”,我需要增加一个计数器。 当遇到文本文件中的位置时,我是这样做的:
: _TIP _DVOTACKA _VRIJEDNOST _SEMICOLON
{result=strcmp($3,string);if(result==0) prvi_uslov=1; }
;
上面的字符串是char string[]="obavezni";
通过这种方式,我得到了一堆关于无法比较 const * char 和 *char 并且其中一个参数是 YYSTYPE 类型的警告。
我昨天开始做 Yacc/Bison,我不知道这意味着什么,我只需要一种简单的方法来比较从文本文件收集的值与现有字符串,如果它们相同,计数器就会上升。就这样。
感谢所有愿意提供帮助的好心人
【问题讨论】:
-
How to Ask。您的问题可能出在 C 上,而不是 flex 或 bison,但谁知道呢?请尽量写清楚详细的问题描述。
标签: c string flex-lexer yacc lex