标签: bison

如何使用缩进作为块分隔符与bison和flex

我想知道如何在bison + flex中将缩进实现为块分隔符.就像在python中一样.我正在编写自己的编程语言(主要是为了好玩,但我打算将它与游戏引擎一起使用),我将尝试提出一些特殊的东西,以最小化样板并最大化开发速度.

我已经在C中编写了一个编译器(实际上是一个'langToy'到Nasm翻译器)但是失败了.由于某种原因,它只能处理整个源文件中的一个字符串(好吧,我已经醒了超过48小时 - 所以...你知道,脑子崩溃了).

我不知道大括号和/或开始 - >结尾是否更容易实现(我没有问题)或者只是我的大脑锁定了.

提前致谢!


更新:好的,我不知道如何使用flex进行操作.将多个DEDENT返回给解析器时遇到问题.Flex/Bison对我来说相对较新.


更新2: 这是我到目前为止提出的flex文件; 它不太明白:

%x t
%option noyywrap

%{
  int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}

%%

<*>\n  { ntab = 0; BEGIN(t); }
<t>\t  { ++ntab; }
<t>.   { int i; /* my compiler complains not c99 if i use for( int i=0... */
         if( ntab > ltab )
           printf("> indent >\n");
         else if( ntab < ltab )
           for( …
Run Code Online (Sandbox Code Playgroud)

compiler-construction bison flex-lexer

10
推荐指数
2
解决办法
5715
查看次数

野牛文件结束

如果我忘记在我的任何文件的末尾添加一个空行,我的程序会出现语法错误.问题是我的语法期望换行结束当前行.由于新行不存在,因此bison不会生成语法错误,因为它没有完成规则.

我该如何解决这个问题?当我这样做时,我试图做出<<EOF>>回报MY_EOF但是因为一次可怕的死亡而崩溃了.我猜其默认EOF中的代码我没有打电话.我不知道它们可能是什么功能.使用EOF创建错误symbol EOF is used, but is not defined as a token and has no rules

yacc lex bison eof

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

使用flex/bison构建Lisp/Scheme类似的解析树

我试图解析简单的Lisp/scheme-like代码

E.g. (func a (b c d) )
Run Code Online (Sandbox Code Playgroud)

从中构建一个树,我可以在不使用的情况下在C中进行解析bison(即,仅 flex使用返回标记并使用递归构建树).但是,使用bison语法,我不知道在哪里添加代码来构建列表(即,与累积终端符号相关联的规则以及将构建列表链接到父节点的位置).

我的语法类似于这里的语法: yacc中Lisp语法,语法是正确的,可以识别代码.

lisp parsing bison s-expression flex-lexer

10
推荐指数
1
解决办法
3458
查看次数

Flex,Bison和C:寻找一个非常基本的介绍

我正在寻找一个非常简短的flex和bison工作示例,附带Makefile,它使用了内置规则.我已经尝试过几个谷歌的结果,这些结果很乱,不会构建,或者是C++,这是不可接受的.赞赏良好的在线资源和简短的示例代码.


额外

     # Makefile example -- scanner and parser.
     # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c"
     #
     LEX     = flex
     YACC    = bison -y
     YFLAGS  = -d
     objects = scan.o parse.o myprogram.o

     myprogram: $(objects)
     scan.o: scan.l parse.c
     parse.o: parse.y
     myprogram.o: myprogram.c
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来与此类似的Makefile,附带的源文件可以做任意简单的事情.

c parsing bison

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

yylval未定义与flex和野牛

我几乎在网上搜索了所有资料.但我仍然困惑为什么lexer无法识别yylval.

情况就是这样:我已经定义了一堆ADT node.h并实现它们node.c,我的目的是在正确存储这些结构后生成AST.但我被困在野牛档案中.

首先,我改%unionunion YYSTYPE {...};typedef union YYSTYPE YYSTYPE;,我不知道为什么我要做到这一点,在网上发布一些其他文件,似乎一道很好地工作%uinion.

然后,我被yylval事情困扰了.我已经做了bison -d一些事情,并且已经检查过了parser.c(我已经指定了bison输出),所以我认为extern YYSTYPE yylval;应该可行.但事实并非如此.所以我想知道是否还有另一种解决yylval未申报问题的方法.

我只使用两种类型的YYSTYPE结构,int并且char *,我可以YYSYTPE将AST 的联合和结构分开吗?这意味着,非终结符将没有关联类型.你们有其他想法吗?

compiler-construction gcc bison flex-lexer

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

使用Flex和Bison进行编译时未定义的对"_yyerror"的引用

我正在尝试为类似Pascal的迷你语言编写一个编译器.我正在使用Flex和Bison,我想出了这个错误.

我的Flex文件:

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

%%

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

program     return PROGRAM;
or          return OR;
and         return AND;
not         return NOT;
if          return IF;
else        return ELSE ;
while       return WHILE;
"+"         return PLUS;
"-"         return MINUS;
"*"         return MUL;
"/"         return DIV;
"["         return LSB;
"]"         return RSB;
"{"         return LCB;
"}"         return RCB;
"("         return LEFTPAR;
")"         return RIGHTPAR;
":="        return ASSIGN;
"==" …
Run Code Online (Sandbox Code Playgroud)

bison flex-lexer

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

转移/减少野牛的冲突

我是新手Bison,我在转换/减少冲突时遇到问题...我正在尝试从文件加载到array data[]:

struct  _data
{
  char name[50]; 
  char surname[50]; 
  int year;
} data[1000];
Run Code Online (Sandbox Code Playgroud)

这是我的野牛代码的一部分:

%token ID NUM NL EOF 

%%

File   : List EOF
       ;
List   : Record
       | List Record
       ;
Record : Name Surname Year NL  { count++; }
       | NL                    { count++; }
       | /*empty*/
       ;
Name   : ID                    { strcpy(data[count].name, yytext); }
       ;
Surname: ID                    { strcpy(data[count].surname, yytext); }
       ;
Year   : NUM                   { data[count].year= atoi(yytext); }
       ;

%%            
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

conflicts: 5 …
Run Code Online (Sandbox Code Playgroud)

grammar parsing bison shift-reduce-conflict

10
推荐指数
1
解决办法
7577
查看次数

上下文无关语法的奇怪问题

我从语言的一个非常好的(和良好的工作)语法开始.变量,二元运算符,函数调用,列表,循环,条件等.对于这个语法,我想添加我正在调用的object构造:

object
  : object_name ARROW more_objects
  ;

more_objects
  : object_name
  | object_name ARROW more_objects
  ;

object_name
  : IDENTIFIER
  ;
Run Code Online (Sandbox Code Playgroud)

关键是能够访问嵌套在对象中的标量.例如:

car->color
monster->weapon->damage
pc->tower->motherboard->socket_type
Run Code Online (Sandbox Code Playgroud)

我加入objectprimary_expression:

primary_expression
  : id_lookup
  | constant_value
  | '(' expression ')'
  | list_initialization
  | function_call
  | object
  ;
Run Code Online (Sandbox Code Playgroud)

现在这是一个示例脚本:

const list = [ 1, 2, 3, 4 ];
for var x in list {
  send "foo " + x + "!";
}
send "Done!";
Run Code Online (Sandbox Code Playgroud)

在此之前将非终结objectprimary_expression一切都是阳光和小狗.即使在我添加之后,Bison也不会抱怨.没有报告转移和/或减少冲突.并且生成的代码在没有声音的情况下编译.但是当我尝试运行上面的示例脚本时,我会被告知error on line …

grammar parsing language-design bison

9
推荐指数
1
解决办法
576
查看次数

如何在编译时为-lfl修复缺少的ld库?

我试图将我的.spl文件转换为C文件(因为没有编译器).我有一个示例"Hello World".spl文件,我已经下载了莎士比亚编程语言 .tar并将其解压缩,但我不知道下一步该怎么做.我似乎无法在任何文档中找到说明.有人可以帮忙吗?

编辑:

当我输入时make -f "Makefile",我得到以下输出:

bison --verbose -d grammar.y
gcc -O2 -Wall -c grammar.tab.c
gcc -O2 -Wall -c makescanner.c
gcc makescanner.o -O2 -Wall -o makescanner
./makescanner include > scanner.l
flex -Cem -t scanner.l > scanner.c
scanner.l:600: warning, rule cannot be matched
gcc -O2 -Wall -c scanner.c
<stdout>:5823: warning: ‘yyunput’ defined but not used
gcc -O2 -Wall -c strutils.c
gcc grammar.tab.o scanner.o strutils.o -O2 -Wall -lfl -o spl2c
ld: library not found for …
Run Code Online (Sandbox Code Playgroud)

compiler-construction dependencies compiler-errors bison flex-lexer

9
推荐指数
2
解决办法
2821
查看次数

为什么我会收到此错误:"数据定义没有类型或存储类"?

#include <stdio.h>
#include <stdlib.h>

struct NODE {
    char* name;
    int val;
    struct NODE* next;
};
typedef struct NODE Node;

Node *head, *tail;
head = (Node*) malloc( sizeof( Node ) ); //line 21
Run Code Online (Sandbox Code Playgroud)

我编译如下:

cc -g -c -o file.tab.o file.tab.c
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

file.y:21:1 warning: data definition has no type or storage class [enabled by default]
Run Code Online (Sandbox Code Playgroud)

c struct pointers bison cc

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