我想知道如何在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) 如果我忘记在我的任何文件的末尾添加一个空行,我的程序会出现语法错误.问题是我的语法期望换行结束当前行.由于新行不存在,因此bison不会生成语法错误,因为它没有完成规则.
我该如何解决这个问题?当我这样做时,我试图做出<<EOF>>
回报MY_EOF
但是因为一次可怕的死亡而崩溃了.我猜其默认EOF中的代码我没有打电话.我不知道它们可能是什么功能.使用EOF创建错误symbol EOF is used, but is not defined as a token and has no rules
我试图解析简单的Lisp/scheme-like代码
E.g. (func a (b c d) )
Run Code Online (Sandbox Code Playgroud)
从中构建一个树,我可以在不使用的情况下在C中进行解析bison
(即,仅
flex
使用返回标记并使用递归构建树).但是,使用bison
语法,我不知道在哪里添加代码来构建列表(即,与累积终端符号相关联的规则以及将构建列表链接到父节点的位置).
我正在寻找一个非常简短的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,附带的源文件可以做任意简单的事情.
我几乎在网上搜索了所有资料.但我仍然困惑为什么lexer无法识别yylval.
情况就是这样:我已经定义了一堆ADT node.h
并实现它们node.c
,我的目的是在正确存储这些结构后生成AST.但我被困在野牛档案中.
首先,我改%union
到union YYSTYPE {...};
和typedef union YYSTYPE YYSTYPE;
,我不知道为什么我要做到这一点,在网上发布一些其他文件,似乎一道很好地工作%uinion
.
然后,我被yylval
事情困扰了.我已经做了bison -d
一些事情,并且已经检查过了parser.c
(我已经指定了bison输出),所以我认为extern YYSTYPE yylval;
应该可行.但事实并非如此.所以我想知道是否还有另一种解决yylval未申报问题的方法.
我只使用两种类型的YYSTYPE
结构,int
并且char *
,我可以YYSYTPE
将AST 的联合和结构分开吗?这意味着,非终结符将没有关联类型.你们有其他想法吗?
我正在尝试为类似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
,我在转换/减少冲突时遇到问题...我正在尝试从文件加载到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) 我从语言的一个非常好的(和良好的工作)语法开始.变量,二元运算符,函数调用,列表,循环,条件等.对于这个语法,我想添加我正在调用的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)
我加入object
的primary_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)
在此之前将非终结object
的primary_expression
一切都是阳光和小狗.即使在我添加之后,Bison也不会抱怨.没有报告转移和/或减少冲突.并且生成的代码在没有声音的情况下编译.但是当我尝试运行上面的示例脚本时,我会被告知error on line …
我试图将我的.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
#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) bison ×10
flex-lexer ×5
parsing ×4
c ×2
grammar ×2
cc ×1
dependencies ×1
eof ×1
gcc ×1
lex ×1
lisp ×1
pointers ×1
s-expression ×1
struct ×1
yacc ×1