我试图将XSS安全字符串插值方案的概念证明放在一起.
给定一个替换字符串,
"Hello <b>$planetoid</b>!"
Run Code Online (Sandbox Code Playgroud)
我希望将其分解为字面部分和替换("Hello<b>" planetoid "</b>!"),然后在字面部分上从左到右运行状态机.当我达到内插值(planetoid在上面)时,我需要能够从状态到达适当的转义函数.
有没有人知道如何使用lex/yacc/bison来派生状态机并能够将语法中的标签与输出状态相关联?我想派生一个状态机,我可以在javascript中使用它们,并尝试替换PHP的底层字符串实现.
我这样做的原因是描述在这里.
欢呼,迈克
拜托我需要你的帮忙.基本上,我在使用gcc编译时遇到此警告消息,并且无法推断出错误:以下是详细信息:
我收到的警告信息按字面意思如下:
y.tab.c:在函数'yyparse'中:y.tab.c:1317
警告:内置函数'strlen'的不兼容隐式声明
我的Lex文件看起来像:
%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "y.tab.h"
void yyerror(const char*);
char *ptrStr;
%}
%START nameState
%%
"Name:" { BEGIN nameState; }
<nameState>.+ {
ptrStr = (char *)calloc(strlen(yytext)+1, sizeof(char));
strcpy(ptrStr, yytext);
yylval.sValue = ptrStr;
return sText;
}
%%
int main(int argc, char *argv[])
{
if ( argc < 3 )
{
printf("Two args are needed: input and output");
}
else
{
yyin = fopen(argv[1], "r");
yyout = fopen(argv[2], "w");
yyparse();
fclose(yyin);
fclose(yyout);
}
return …Run Code Online (Sandbox Code Playgroud) 我有一个我正在写的语法,叫做portugol.文件名是基本的,但我选择调用我的c程序portugol.c.
所以,基本上,我必须这样做:
flex portugol.l ==> lex.yy.c
bison -dy portugol.y ==> y.tab.c and y.tab.h
gcc y.tab.c lex.yy.c portugol.c -o portugol.bin -lm -ly ==> portugol.bin
Run Code Online (Sandbox Code Playgroud)
(我也有portugol.h,但它与问题无关)
很长一段时间以来,我正在使用我称之为的shell脚本flexyagcc.sh.过程中没有错误.
所以现在我决定学习makefile.
我面临的问题是,由于一些奇怪的原因," bison -dy"我打电话后跟这个命令我没写:mv -f y.tab.c portugol.c
好吧,这破坏了我手工制作的源文件!
我尽我所能,但无法摆脱这个" mv".
我甚至做了一个sleep尝试过:
y.tab.c y.tab.h : portugol.y
@echo --- bison -----------------------------------------------
mv -f portugol.c ptg.c
$(BISON) $(BFLAGS) portugol.y
@echo --- bison sleeping --------------------------------------
sleep 5
-mv -f portugol.c y.tab.c
-mv -f ptg.c portugol.c
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,我得到了以下事件(按此顺序): …
我的语法中有一个简单的规则,它查找空格的序列:
ws: ws|' ';
Run Code Online (Sandbox Code Playgroud)
当野牛看到这个规则时,它会抱怨:
警告:由于冲突,规则在解析器中无用:ws:ws
为什么会这样?我有一个简单的语法规则,寻找一个正则表达式?
假设这段代码有效:
left '*'
left '+'
expr: expr '+' expr
| expr '*' expr
;
Run Code Online (Sandbox Code Playgroud)
我想定义另一个优先标记,例如:
left MULTIPLY
left PLUS
expr: expr '+' expr %prec PLUS
| expr '*' expr %prec MULTIPLY
;
Run Code Online (Sandbox Code Playgroud)
但这实际上并没有效果。
我认为这两种形式应该是等价的,但事实并非如此。
这不是实际问题。我只是想知道这种现象的原因和原理。
谢谢。
我想在我的应用程序中实现脚本语言.仅用于控制某些行为,定义规则等.
我没有找到使用Lua over bison/yacc的理由,反之亦然.这些工具有哪些优缺点?
从实现点来看,Lua似乎更容易实现,而yacc/bison需要学习编写解析器标记,但后来我有一个独立的解析器.除此之外有什么区别?
如何在yacc中指定具有相同操作的多个规则示例:
variable : string {
cout<<$1<<endl;
}
| int {
cout<<$1<<endl;
}
我正在尝试为简化的 Java 语言运行我自制的编译器,但是我总是以分段错误告终。目标是构建一个抽象的语法树。我还尝试使用 valgrind 进行调试,但看起来该工具在我的 PC 上存在一些有关 bison 和 flex 的问题。请帮我。
Lexfile:
%{
#include <stdio.h>
#include "abst.h"
#include "yacc.tab.h"
int yylineno;
int column = 0;
int nesting_comments = 0;
int max_comment_level = 0;
int total_comments_number = 0;
void count() {
int i;
for(i = 0; yytext[i] != '\0'; i++){
if(yytext[i] == '\n')
column = 0;
else if(yytext[i] == '\t')
column += 8 - (column % 8);
else
column++;
}
//printf("%s", yytext); Uncomment this Line for printing the input stream
} …Run Code Online (Sandbox Code Playgroud) 我想在YACC中编写算术表达式的规则;其中定义了以下操作:
+ - * / ()
Run Code Online (Sandbox Code Playgroud)
但是,我不希望该语句带有括号。也就是说,a+(b*c)应该有一个匹配的规则,但是(a+(b*c))不应该。
我该如何实现?
动机:
在我的语法中,我定义了一个这样的集合:(1,2,3,4)并且我想(5)被视为1元素集合。模糊性导致减少/减少冲突。
因此,在我< 24 小时的野牛/ flex 调查中,我看到很多文档表明左递归优于右递归。有些地方甚至提到,对于左递归,您需要在 Bison 解析器堆栈上保持恒定空间,而右递归则需要 N 阶空间。但是,我找不到任何可以明确解释正在发生的事情的来源。
作为一个例子(只加减的解析器):
扫描器:
%%
[0-9]+ {return NUMBER;}
%%
Run Code Online (Sandbox Code Playgroud)
解析器:
%%
/* Left */
expression:
NUMBER
| expression '+' NUMBER { $$ = $1 + $3; }
| expression '-' NUMBER { $$ = $1 - $3; }
;
/* Right */
expression:
NUMBER
| NUMBER '+' expression { $$ = $1 + $3; }
| NUMBER '-' expression { $$ = $1 - $3; }
;
%%
Run Code Online (Sandbox Code Playgroud)
对于 1+5-2 的示例,似乎在左递归中,解析器从词法分析器接收 '1' 并看到 …