标签: yacc

如何在yacc中使用yylval和字符串

我想传递令牌的实际字符串.如果我有一个名为ID的令牌,那么我希望我的yacc文件实际知道调用了什么ID.我必须使用yylval将字符串传递给flex文件中的yacc文件.我怎么做?

yacc bison lexical-analysis

5
推荐指数
2
解决办法
2万
查看次数

在解析整个字符串之前,如何让Bison/YACC无法识别命令?

我有一些野牛语法:

input: /* empty */
       | input command
;

command:
        builtin
        | external
;

builtin:
        CD { printf("Changing to home directory...\n"); }
        | CD WORD { printf("Changing to directory %s\n", $2); }
;
Run Code Online (Sandbox Code Playgroud)

我想知道我怎么让Bison不接受(YYACCEPT?)的东西command直到它读取所有输入.所以我可以在下面使用所有这些规则来使用递归或任何构建的东西,这会导致有效的命令或不起作用的东西.

我正在使用上面的代码进行的一个简单测试就是输入"cd mydir mydir".野牛解析CD并且WORD"嘿!这是一个命令,把它放到顶部!".然后它找到的下一个标记就是WORD,它没有规则,然后报告错误.

我希望它读取整行并意识到CD WORD WORD不是规则,然后报告错误.我想我错过了一些明显的东西,非常感谢任何帮助 - 谢谢!

此外 - 我尝试使用input command NEWLINE或类似的东西,但它仍然CD WORD作为一个命令推到顶部,然后分别解析额外的WORD.

c parsing yacc bison

5
推荐指数
1
解决办法
581
查看次数

很好地格式化Bison/Yacc语法文件的工具?

您好:您是否知道任何GNU/Linux实用程序可以格式化包含C代码的Bison语法文件?我正在考虑GNU Indent的一些东西,但是它旨在美化语法文件而不是C代码.

parsing yacc pretty-print bison

5
推荐指数
1
解决办法
1385
查看次数

在CodeBlocks/Eclipse中构建一个使用yacc和lex的C++项目

我有以下makefile,它正常工作,以构建我的应用程序.如何配置IDE(比如,codeblocks,eclipse)来编译它.yacc当我尝试使用eclipse/codeblocks时,与之关联的C/C++文件会出现一些错误.有没有办法让eclipse/codeblocks在构建/链接时直接使用某个组件的目标文件而不指定(包括在项目中)相应的.cc文件?如果是这样,我可以直接使用y.tab.o,lex.yy.o因为我的项目没有改变.

CC = g++ -O2 -Wno-deprecated 

tag = -i

ifdef linux
tag = -n
endif

main.out: Sentence.o XOperation.o XOperationEngine.o Schema.o Doc.o TaskMan.o y.tab.o lex.yy.o test.o
    $(CC) -o main.out Sentence.o XOperation.o XOperationEngine.o Schema.o Doc.o TaskMan.o y.tab.o lex.yy.o test.o -lfl

main.o: main.cc
    $(CC) -g -c main.cc

XOperation.o: XOperation.cc
    $(CC) -g -c XOperation.cc

XOperationEngine.o: XOperationEngine.cc
    $(CC) -g -c XOperationEngine.cc

TaskMan.o: TaskMan.cc
    $(CC) -g -c TaskMan.cc

Doc.o: Doc.cc
    $(CC) -g -c Doc.cc

Sentence.o: Sentence.cc
    $(CC) -g -c Sentence.cc …
Run Code Online (Sandbox Code Playgroud)

c++ yacc makefile g++

5
推荐指数
1
解决办法
1445
查看次数

YACC规则没有减少

我正在努力学习YACC并且在弄清楚它给我的警告信息时遇到了一些麻烦.这是我的文件的一部分:

define_character: WORD IS STRING COLOR
{
    printf("%s's full name is %s and thier color is %s", $1, $3, $4);
};

dialog: WORD COLON STRING
{
    printf("%s says %s", $1, $3);
};

change_scene: SCENE SETSCENE WORD
{
    printf("%s is the new scene", $3);
};
Run Code Online (Sandbox Code Playgroud)

它给我的警告是:

2 rules never reduced
2 useless nonterminals and 2 useless rules
warning: useless nonterminal: dialog
warning: useless nonterminal: change_scene
warning: useless rule: dialog: WORD SEMICOLON STRING
warning: useless rule: change_scene: SCENE SETSCENE WORD
Run Code Online (Sandbox Code Playgroud)

我该如何解决这些问题?我试过搜索,我发现由于转移/减少冲突而导致错误的人.似乎YACC通常会将其添加到警告输出中,如果有的话,只是为了确保我尝试从change_scene中删除WORD,这样它就不会寻找任何与其他令牌相同的令牌,但它仍然没有减少.我可以测试所有的规则,因为无论哪个都在顶部是有效的.我在第一条规则的末尾错过了一些语法,导致其余的问题?

yacc bison

5
推荐指数
1
解决办法
4065
查看次数

Emacs TAGS表在lex/yacc文件中被#line指令混淆

我正在尝试使用etags为大型软件项目生成TAGS表.由于lex/yacc生成的.c文件中的#line指令引用了非限定文件名而不是#,TAGS文件最终会在顶层显示不存在的文件而不是子目录中存在的文件.包含包含该文件的子目录的行.

如何通过将这些#line指令正确解析为子目录中的现有文件而不是被解释为顶级文件来生成TAGS表?

我从顶级目录运行这样的etags:

rm -f TAGS; find . \( -not -regex '.*include/.*' \)
                -a \( -name '*.h' -o -name '*.hh' -o -name '*.y' -o -name '*.l'
                   -o -name '*.cc' -o -name '*.cpp' -o -name '*.hpp' -o -name '*.c'
                   -o -name '*.inl' \)
             | xargs etags -o TAGS --append
Run Code Online (Sandbox Code Playgroud)

但我有一个文件,act/Par.c,在生成的文件中间包含以下行:

#define T_NUM 274
#define T_STRING 275

#line 5 "Par.y"

#undef actCPMeshConfigIn_yywrap
#define actCPMeshConfigIn_YYMAXDEPTH 20000
Run Code Online (Sandbox Code Playgroud)

这导致以下TAGS表条目:

act/Par.c,1160
[...]
#define T_NUM 92,2870
#define T_STRING 93,2888

Par.y,1320
#undef actCPMeshConfigIn_yywrap20,
#define actCPMeshConfigIn_YYMAXDEPTH 22,
Run Code Online (Sandbox Code Playgroud)

但是文件Par.y实际上位于act/Par.y,但#line指令相对于当前文件,但TAGS使其相对于生成的TAGS文件.

在不改变我构建项目的方式的情况下,如何生成TAGS文件,以便将这些#line指令正确解释为相对于它们出现的文件?或者,如何轻松跳过这些麻烦的文件?

tags emacs etag yacc lex

5
推荐指数
1
解决办法
163
查看次数

SQL lex yacc语法

所有,

为嵌入式sql开发验证应用程序

我将使用ansi c或c ++作为开发语言

我在哪里获得lex和yacc的sql语法?

sql yacc lex

5
推荐指数
1
解决办法
7828
查看次数

5
推荐指数
1
解决办法
540
查看次数

为什么Visual Studio 2012在源文件未更改时运行自定义构建步骤?

我正在使用yacc和lex与Visual Studio 2012 C++/CLI并为yacc源文件创建了一个自定义构建步骤,如下图所示

自定义构建属性页面

输出文件有两个依赖项.它们是yacc源文件icl5kyacc.y和yyparse.c模板文件.每次构建解决方案时,即使尚未修改yyparse.c和icl5kyacc.y源文件,也会运行自定义构建步骤.这是构建后的目录列表.

  21-Sep-2012  10:19:18p         28,210    A icl5kyacc.y
  17-Sep-2012   7:32:06p          9,042    A yyparse.c
  22-Sep-2012  11:43:56a         38,233    A ICL5KYACC.cpp
  22-Sep-2012  11:43:56a          2,160    A icl5kyacc.h
Run Code Online (Sandbox Code Playgroud)

再次建造之后

2>从icl5kyacc.y生成icl5kyacc.cpp

  21-Sep-2012  10:19:18p         28,210    A icl5kyacc.y
  17-Sep-2012   7:32:06p          9,042    A yyparse.c
  22-Sep-2012  11:45:46a         38,233    A ICL5KYACC.cpp
  22-Sep-2012  11:45:46a          2,160    A icl5kyacc.h
Run Code Online (Sandbox Code Playgroud)

我错误地认为使用自定义构建步骤应该在构建步骤的输入和输出文件之间自动应用标准依赖关系规则吗?我很好奇的一件事是Studio(附加依赖项)中为我提供的%(AdditionalInputs)宏.不知道那是什么,或者是否以某种方式指向正在修改的文件.

c msbuild dependencies yacc visual-studio

5
推荐指数
1
解决办法
2569
查看次数

y.tab.c:对yylex的未定义引用

我试图运行一个我在网上发现计算器的例子.但是每次运行gcc命令时都会显示此错误.以下是我运行的命令:

flex -l calc3.l
yacc -vd calc3.y
gcc y.tab.c -lm -ll
Run Code Online (Sandbox Code Playgroud)

- >此时我收到此错误消息:

/tmp/ccPOq58f.o : In function 'yyparse':
y.tab.c: undefined reference to 'yylex' 
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

calc3.l

%{
#include <stdlib.h>
#include "calc3.h"
#include "y.tab.h"
void yyerror(char *);
%}

%%

[a-z]       { 
                yylval.sIndex = *yytext - 'a';
                return VARIABLE;
            }

0           {
                yylval.iValue = atoi(yytext);
                return INTEGER;
            }

[1-9][0-9]* {
                yylval.iValue = atoi(yytext);
                return INTEGER;
            }

[-()<>=+*/;{}.] {
                return *yytext;
             }

">="            return GE;
"<="            return …
Run Code Online (Sandbox Code Playgroud)

yacc

5
推荐指数
1
解决办法
1万
查看次数