标签: yacc

从BNF语法中导出状态机

我试图将XSS安全字符串插值方案的概念证明放在一起.

给定一个替换字符串,

"Hello <b>$planetoid</b>!"
Run Code Online (Sandbox Code Playgroud)

我希望将其分解为字面部分和替换("Hello<b>" planetoid "</b>!"),然后在字面部分上从左到右运行状态机.当我达到内插值(planetoid在上面)时,我需要能够从状态到达适当的转义函数.

有没有人知道如何使用lex/yacc/bison来派生状态机并能够将语法中的标签与输出状态相关联?我想派生一个状态机,我可以在javascript中使用它们,并尝试替换PHP的底层字符串实现.

我这样做的原因是描述在这里.

欢呼,迈克

yacc bnf bison pushdown-automaton

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

如何修复与Yacc中使用的strlen()相关的警告消息?

拜托我需要你的帮忙.基本上,我在使用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)

yacc lex bison

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

在没有被要求的情况下打电话给野牛

我有一个我正在写的语法,叫做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)

但令我惊讶的是,我得到了以下事件(按此顺序): …

yacc lex makefile bison

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

野牛错误

我的语法中有一个简单的规则,它查找空格的序列:

    ws: ws|' ';
Run Code Online (Sandbox Code Playgroud)

当野牛看到这个规则时,它会抱怨:

警告:由于冲突,规则在解析器中无用:ws:ws

为什么会这样?我有一个简单的语法规则,寻找一个正则表达式?

c c++ yacc bison

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

为什么在某些情况下我不能使用令牌作为优先标记

假设这段代码有效:

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)

但这实际上并没有效果。

我认为这两种形式应该是等价的,但事实并非如此。

这不是实际问题。我只是想知道这种现象的原因和原理。

谢谢。

parsing yacc bison operator-precedence

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

我想在C++项目中包含脚本语言.Lua vs Bison/Yacc

我想在我的应用程序中实现脚本语言.仅用于控制某些行为,定义规则等.

我没有找到使用Lua over bison/yacc的理由,反之亦然.这些工具有哪些优缺点?

从实现点来看,Lua似乎更容易实现,而yacc/bison需要学习编写解析器标记,但后来我有一个独立的解析器.除此之外有什么区别?

c++ dsl lua yacc bison

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

多个规则在yacc中执行相同的操作

如何在yacc中指定具有相同操作的多个规则示例:

variable : string { cout<<$1<<endl; } | int { cout<<$1<<endl; }

yacc

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

关于 Flex、Bison 和 Segmentation Fault

我正在尝试为简化的 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)

c yacc lex bison flex-lexer

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

YACC语法用于算术表达式,不带括号

我想在YACC中编写算术表达式的规则;其中定义了以下操作:

+   -   *   /   ()
Run Code Online (Sandbox Code Playgroud)

但是,我不希望该语句带有括号。也就是说,a+(b*c)应该有一个匹配的规则,但是(a+(b*c))不应该。

我该如何实现?


动机:

在我的语法中,我定义了一个这样的集合:(1,2,3,4)并且我想(5)被视为1元素集合。模糊性导致减少/减少冲突。

parsing yacc bnf

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

左/右递归和 Bison 解析堆栈行为

因此,在我< 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' 并看到 …

recursion yacc lex bison flex-lexer

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