yacc

Shift Reduce Conflict for arithmetic expressions in yacc

别来无恙 提交于 2021-02-08 08:30:40
问题 This grammar has given me conflict despite specifying precedence of operators. Even in the Dragon book it's been resolved in such a way(the way implemented as first 7 lines below) but it still gets conflict! Below is the code implemented in yacc %right THEN_KW %right ELSE_KW %left XOR_KW OR_KW %right '=' %left AND_KW ALSO_KW %left EQ_KW LT_KW GT_KW LE_KW GE_KW %left PLUS_KW MINUS_KW %left MULT_KW DIV_KW MOD_KW %right NOT_KW arthlogicexpr -> operand | arthlogicexpr arthop arthlogicexpr arthop

yyllocp->first_line returns uninitialized value in second iteration of a reEntrant Bison parser

痴心易碎 提交于 2021-01-29 14:02:23
问题 I have a reEntrant parser which takes input from a string and has a structure to maintain context. A function is called with different input strings to be parsed. Relevant code of that function is: void parseMyString(inputToBeParsed) { //LEXICAL COMPONENT - INITIATE LEX PROCESSING yyscan_t scanner; YY_BUFFER_STATE buffer; yylex_init_extra(&parseSupportStruct, &scanner ); //yylex_init(&scanner); buffer = yy_scan_buffer(inputToBeParsed, i+2, scanner); if (buffer == NULL) { strcpy(errorStrings,

Ply shift/reduce conflicts: dangling else and empty productions

笑着哭i 提交于 2021-01-29 08:46:34
问题 I had lots of conflicts, most of them were due to operators and relational operators which had different precedences. But I still face some conflicts that I don't really know how to tackle them. some of them are below. I suspect that maybe I should do epsilon elimination for stmtlist but to be honest I'm not sure about it. state 70: state 70 (27) block -> LCB varlist . stmtlist RCB (25) varlist -> varlist . vardec (28) stmtlist -> . stmt (29) stmtlist -> . stmtlist stmt (30) stmtlist -> . (15

How to read multiple lines of input in lex and yacc?

落爺英雄遲暮 提交于 2021-01-28 02:10:20
问题 I want the output as: a=3 mov a,3 a=fs mov b,fs b=32 mov b,32 Program for 3 address intermediate code generation - the lex file written for lexical analysis reads the input from command line and passes tokens: %{ #include "y.tab.h" #include "string.h" #include <math.h> %} %% [a-zA-Z]+ { yylval.var=(char *)malloc(sizeof(char *)); strcpy(yylval.var,yytext); return ID;} "=" return EQUALS; [0-9]+ {yylval.num=atoi(yytext);return DIGIT;} %% The corresponding yacc file: %{ #include "stdio.h"

How can flex return multiple terminals at one time

故事扮演 提交于 2021-01-27 18:51:22
问题 In order to make my question easy to understand I want to use the following example: The following code is called nonblock do-loop in fortran language DO 20 I=1, N ! line 1 DO 20 J=1, N ! line 2 ! more codes 20 CONTINUE ! line 4 Pay attention that the label 20 at line 4 means the end of both the inner do-loop and the outer do-loop. I want my flex program to parse the feature correctly: when flex reads the label 20 , it will return ENDDO terminal twice. Firstly, because I also use bison, so

Syntax error using empty production rule in python PLY(lex/yacc)

萝らか妹 提交于 2021-01-02 03:47:34
问题 The full example is given here: import ply.lex as lex import Property # List of token names. This is always required tokens = [ 'CheckupInformation', 'Introduction', 'Information', 'perfect', 'sick', 'LPAREN', 'RPAREN', 'CHAR', 'NUMBER' ] def t_CheckupInformation(t) : 'CheckupInformation' ; return t def t_Introduction(t) : 'Introduction' ; return t def t_Information(t) : 'Information' ; return t def t_perfect(t): 'perfect'; return t def t_sick(t) : 'sick'; return t t_LPAREN = r'\(' t_RPAREN =

Ubuntu安装flex和bison

不羁的心 提交于 2020-11-26 18:49:51
在学习虎书,第二章练习要用lex和yacc,然而作者提供的 网址 上放的是flex和bison,当然这样更好啦(flex和bison完全兼容lex和yacc)。考虑到在windows下用这两个玩意还要安装masm,所以最后决定上虚拟机(之前操作系统课就装过了,幸亏没卸载哈哈哈)。 Ubuntu下使用 sudo apt-get install flex bison 命令,不一会就装好了,如图: 然后写了一个测试程序,就用Ubuntu自带的gedit写, 保存为.l文件 : %% [\t] + is | am | are | was | were { printf ( "%s: is a verb\n" ,yytext);} [a-zA-Z] + { printf ( "%s: is not a verb" ,yytext);} .|\ n %% int main (){ yylex (); } 使用命令 lex verb.l 再使用命令 gcc lex.yy.l -lfl 最后运行 ./a.out 这个程序会判断输入的单词是不是动词: 程序成功运行也说明我们安装配置成功了。 来源: oschina 链接: https://my.oschina.net/u/4518215/blog/4751194

Go实现自定义语言的基础

我是研究僧i 提交于 2020-11-06 10:35:03
0x01 自言自语 一直就对解析文档,比较感兴趣,一直没深入研究,只停留在仅知道 Lex & yacc 和 antlr 的名词阶段,最近看了go-zero的api解析器,觉得甚好,是时候花时间学习一下了。 简单看了go-zero发现是自己实现了词法分析、语法解析,这不符合我的一贯偷懒作风,所以并未其源码开始学习。既然用golang那么他自带的goyacc就是我学习的不二之选。当然你可能会听说Lex&yacc 已经很古老了,antlr更先进一点。但是既然goyacc能成为golang官方工具,那么肯定还是值得你学习的。 goyacc的文档非常的少,少到什么程度?少到你未来一定能搜到这篇。甚至连github上的使用例子也不多,大致就分两类:计算器、sql解析器,其中计算器目测是国外某大学的课程。 所以研究goyacc我花了好几个通宵、掉了少许头发。不经让这篇文章有了一个营销文案:花了一夜时间,搞懂了外国的一堂编译原理课。 个人对技术文章的理解是,文章可以有自己的观点、啰嗦、甚至幽默,但尽量不要放在学术部分,毕竟技术是严禁的。所以下面描述,我可尽能做一个无情的打字机,尽可能的按照文档风描述。 0x02 goyacc简易入门 安装 goyacc golang 1.8 版本之前 yacc 直接再带与go tool 无需自行安装。 鉴于使用的频率太少,遂在 golang 1.8 版本后

MySQL利用ODBC转义({})注入手法分析

给你一囗甜甜゛ 提交于 2020-10-14 20:29:51
前言 最近由于工作需要在看libinjection的源码,查到一位师傅发了一篇绕过libinjection的文章, https://www.o2oxy.cn/2772.html 由于URL编码和HEX编码的问题,感觉这位师傅写的不是很对,就发评论跟他讨论,当然他整个libinjection的流程分析还是很不错的。 讨论了半天,这位师傅又抛出了一个payload,说libinjection也检测不出来 1 = { date ( if ( mid ( ( updatexml ( 1 , concat ( 0x7e , ( select user ( ) ) , 0x7e ) , 1 ) ) , 1 , 1 ) = '1' , 2 , 1 ) ) } 尝试了一下的确如此: 翻看MySQL语法分析的产生式 很久之前看到过这种注入的手法,当时没有深究,这次打算好好研究一下。 mysql的SQL解析语法文件: https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L9899 (这个是yacc的产生式文件,有兴趣的师傅可以去找找lex&yacc的资料,顺便看看编译原理更佳~) PS:开头注释表明5.7之后语法分析就没有变过 看这个文件懵逼了很久,最后直接搜索’{’(三个字符)找到了关键点: '{' 标志符 表达式 '}'

Go实现自定义语言的基础

喜夏-厌秋 提交于 2020-09-30 13:41:35
0x01 自言自语 一直就对解析文档,比较感兴趣,一直没深入研究,只停留在仅知道 Lex & yacc 和 antlr 的名词阶段,最近看了go-zero的api解析器,觉得甚好,是时候花时间学习一下了。 简单看了go-zero发现是自己实现了词法分析、语法解析,这不符合我的一贯偷懒作风,所以并未其源码开始学习。既然用golang那么他自带的goyacc就是我学习的不二之选。当然你可能会听说Lex&yacc 已经很古老了,antlr更先进一点。但是既然goyacc能成为golang官方工具,那么肯定还是值得你学习的。 goyacc的文档非常的少,少到什么程度?少到你未来一定能搜到这篇。甚至连github上的使用例子也不多,大致就分两类:计算器、sql解析器,其中计算器目测是国外某大学的课程。 所以研究goyacc我花了好几个通宵、掉了少许头发。不经让这篇文章有了一个营销文案:花了一夜时间,搞懂了外国的一堂编译原理课。 个人对技术文章的理解是,文章可以有自己的观点、啰嗦、甚至幽默,但尽量不要放在学术部分,毕竟技术是严禁的。所以下面描述,我可尽能做一个无情的打字机,尽可能的按照文档风描述。 0x02 goyacc简易入门 安装 goyacc golang 1.8 版本之前 yacc 直接再带与go tool 无需自行安装。 鉴于使用的频率太少,遂在 golang 1.8 版本后