【问题标题】:How do you compare 2 strings in Yacc/Bison?你如何比较 Yacc/Bison 中的 2 个字符串?
【发布时间】: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


【解决方案1】:

我一直在为同一个例子而苦苦挣扎,并且找到了解决方案。输入后错误消失:

#define YYSTYPE char *

我的代码在这里也有点不同:

int val = strcmp($8, "obavezni");
if (val == 0){
    if($11 > 5) 
    temp++;

【讨论】:

    【解决方案2】:

    Yacc 生成的解析器(或者您实际使用的任何 Yacc 衍生产品,可能是 Bison)和 Flex 生成的词法分析器是独立的程序;这两个工具彼此不了解。两个程序之间的通信(至少在默认情况下)是通过全局变量yylval。默认情况下,yylval 的类型为int,但这种情况很少见。在大多数现实生活中的解析应用程序中,有必要给yylval一个不同的类型。解析器和词法分析器必须就此类型达成一致。这种类型称为解析器的“语义类型”;它用于产生式规则中所有文法符号的语义值。

    更改yylval 语义类型的传统方法是(重新)定义预处理器宏YYSTYPE。如果这样做,则必须确保新定义包含在解析器和词法分析器中,这意味着要么将其包含在.l.y 文件的序言中。您似乎只在词法分析器文件中完成了它,结果是在您的解析器中,语义类型是默认的int。 C 编译器抱怨使用$3 作为strcmp 的参数,因为$3int,这不是用于字符串比较的有效参数类型。

    但是我建议您也不要将预处理器定义也添加到您的解析器中,尽管目前这样做是可行的。相反,您应该使用 Bison 声明来声明语义类型:

    %define api.value.type { char * }
    

    如果你这样做,Bison 会将声明放入头文件中,你已经将它 #include 放入你的词法分析器中。这样,单个声明将保证解析器和词法分析器中的类型相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多