标签: lex

最好的现代文本解析?AKA何时使用Lex和Yacc?

我有输入文本块的命令和参数,每行一个,如

XYZ ARG1,ARG2,ARG3,...,ARGN
Run Code Online (Sandbox Code Playgroud)

我想验证参数XYZ是否适合该特定命令并执行正确的代码块(如果是).有大约100个命令,其中一些有可变数量的参数,不同的关系(即如果命令XYZ被调用,那么我也需要ABC调用命令).

还存在命令,例如:

COMMAND
XYZ ARG1
BEF ARG1 ARG2
ENDCOMMAND
Run Code Online (Sandbox Code Playgroud)

重要的是文本包含在COMMAND和中ENDCOMMAND.

通常对于这样的事情,我会使用Lex和Yacc而不是正则表达式,但还有更现代的东西吗?代码是用C#编写的.在MSDN中有什么可以做到这一点而不是旧学校C Lex和Yacc吗?

regex parsing yacc lex

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

为什么yylval为null?

我正在尝试使用Flex&Bison编写我的第一个解析器.在解析数字时,我正在尝试将它们的值保存到yylval结构中.问题是,yylval当词法分析器达到一个数字时为null,这会导致分段错误.

(相关混乱的观点:那为什么在大多数Flex的例子(如这里), yylval?是一个结构,而不是指向结构的指针我无法yylval在test.l承认没有%option bison-bridge,而选择做yylval一个指针.另外,我试图初始化yylvalmaintest.y的,但yylval = malloc(...)给人一种类型mismatch--仿佛yylval不是一个指针......?)

test.l

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include "svg.tab.h"
%}

%option bison-bridge
%option noyywrap

%%

[0-9]+  { yylval->real = atof(yytext); return REAL; }

. { return *yytext; }

%%
Run Code Online (Sandbox Code Playgroud)

test.y:

%{
    #include <stdio.h>
    void yyerror(char *);   
%}

%union {
    double real;
}

%token <real> REAL

%%
...
Run Code Online (Sandbox Code Playgroud)

构建命令:

bison -d test.y && …
Run Code Online (Sandbox Code Playgroud)

yacc lex bison flex-lexer

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

《 Unix编程环境》一书中的Hoc1基本Lex文件

在“ Unix编程环境”一书中,该书依赖于为编写“ hoc”这一章中的一个例子(除了其中一个例子)之外的所有例子编写自己的词法分析器。

我真的很想在第一个示例hoc1中使用lex。当我尝试使用lex编写自己的程序时,直到出现语法错误,程序才会输出响应。

该代码可以在Unix编程环境网站上看到 ...

yacc lex bison

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

YACC中的错误处理

您好,我正在尝试制作一个简单的解析器并使用lex和yacc.问题是我想打印我自己的错误信息而不是error打印的yacc使用的符号syntax error.例如,这是我的yacc代码;

%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern FILE *yyin;
extern int linenum;
%}

%token INTRSW IDENTIFIER INTEGER ASSIGNOP SEMICOLON DOUBLEVAL DOUBLERSW COMMA 
%token IF ELSE WHILE FOR
%token CLOSE_BRA OPEN_BRA CLOSE_PARA OPEN_PARA EQ LE GE
%token SUM MINUS MULTIP DIV

%left OPEN_BRA OPEN_PARA
%left MULTIP DIV
%left SUM MINUS

%union 
{
        int number;
        char* string;
}

%token <number> INTEGER
%token <string> IDENTIFIER

%%
program: 
    statement_list
    ;

statement_list:
        statement_list statement
        |
        statement
        ;

statement: …
Run Code Online (Sandbox Code Playgroud)

parsing yacc lex lexical-analysis

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

让lex读取UTF-8不起作用

我写了一个解析ASCII文件的xml解析器,但我现在需要能够读取UTF-8编码的文件.我在lex中有以下正则表达式但它们与UTF-8不匹配.我不确定我做错了什么:

utf_8       [\x00-\xff]*
bom         [\xEF\xBB\xBF]
Run Code Online (Sandbox Code Playgroud)

然后:

bom             { fprintf( stderr, "OMG I SAW A BOM"); return BOM;}
utf_8           { fprintf( stderr, "OMG I SAW A UTF CHAR", yytext[0] ); return UTF_8;}
Run Code Online (Sandbox Code Playgroud)

我还有以下语法规则:

program 
: UTF8 '<' '?'ID attribute_list '?''>' 
root ...
Run Code Online (Sandbox Code Playgroud)

在哪里UTF8:

UTF8

: BOM           {printf("i saw a bom\n");}
| UTF_8         {printf("i saw a utf\n");}
|               {printf("i didn't see anything.'\n");} 
;
Run Code Online (Sandbox Code Playgroud)

它总是出现i didn't see anything,我的解析器适用于ASCII文件,也就是当我将XML UTF-8文件粘贴到空文档中时.

任何帮助,将不胜感激.

编辑:

这是一个修剪过的.l文件供参考:

%{
#include <stdio.h>
#include <stdlib.h> …
Run Code Online (Sandbox Code Playgroud)

c xml parsing lex utf-8

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

在没有%prec或%left的情况下在Bison中设置优先级和关联性

如何在不使用%prec或%left的情况下在Bison中设置优先级和关联性?有没有办法在不需要的地方编写语法?

compiler-construction yacc lex bison flex-lexer

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

无法调试 lex.yy.cc 文件

我创建了一个 lex 文件 test.l 并从中创建了 lex.yy.c,然后我用 gcc -g 标志编译

我正在链接它,并且在编译调用 yylex() 的其余代码时没有问题,但是,在 GDB 中,我似乎无法深入调用 yylex()。

我究竟做错了什么?我在 yylex() 方法本身中放置了断点,这导致 gdb 在我调用 yylex() 时停止,但从未在函数内部。

我是否需要使用调试符号或其他东西编译 -l 库?

我知道它正在运行,因为我用 -d 创建了我的 lex.yy.c 文件,所以我看到了接受令牌等的输出。

谢谢

c lex

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

野牛与yyerror的冲突类型

我正在尝试从flex和bison制作计算器,但我在编译期间发现了一个错误.

这是错误:

C:\GnuWin32\src>gcc lex.yy.c y.tab.c -o tugas
tugas.y:51: error: conflicting types for 'yyerror'
y.tab.c:1433: error: previous implicit declaration of 'yyerror' was here
Run Code Online (Sandbox Code Playgroud)

这是我的.l代码:

%{
#include <stdio.h>
#include "y.tab.h"
YYSTYPE yylval;
%}
plus    [+]
semi    [;]
minus   [-]
var [a-z]
digit   [0-1]+
equal   [:=]
%%
{var}   {yylval = *yytext - 'a'; return VAR;}
{digit} {yylval = atoi(yytext); return DIGIT;}
{plus}  {return PLUS;}
{minus} {return MINUS;}
{equal} {return EQUAL;}
{semi}  {return SEMI;}
 .  { return *yytext; }
%%
int main(void)
{
 yyparse(); …
Run Code Online (Sandbox Code Playgroud)

c lex bison

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

flex/bison中的半保留字处理

考虑一下这个lex.l文件:

%{
#include "y.tab.h"
%}

digit         [0-9]
letter        [a-zA-Z]

%%
"+"                  { return PLUS;       }
"-"                  { return MINUS;      }
"*"                  { return TIMES;      }
"/"                  { return SLASH;      }
"("                  { return LPAREN;     }
")"                  { return RPAREN;     }
";"                  { return SEMICOLON;  }
","                  { return COMMA;      }
"."                  { return PERIOD;     }
":="                 { return BECOMES;    }
"="                  { return EQL;        }
"<>"                 { return NEQ;        }
"<"                  { return LSS;        }
">"                  { return GTR;        } …
Run Code Online (Sandbox Code Playgroud)

yacc lex bison lexical-analysis flex-lexer

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

匹配EOF但是在flex中无限循环

我需要在flex中匹配EOF

这是我的代码lex.l的主要错误部分

%{
%}
%%
<<EOF>> {printf("match EOF\n");}
%%
int main(){
    yylex();
}
Run Code Online (Sandbox Code Playgroud)

我用

flex lex.l  ;  gcc lex.yy.c -o lex.exe -lfl ; lex.exe < text 
Run Code Online (Sandbox Code Playgroud)

执行

这是我的文本文件只有一行

abc(no \n or \r at the end of file)
Run Code Online (Sandbox Code Playgroud)

但是当我执行lex.exe时,它进入无限循环并输出无限行"匹配EOF \n"

如何解决问题?

regex lex match eof flex-lexer

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

标签 统计

lex ×10

yacc ×6

bison ×5

flex-lexer ×4

c ×3

parsing ×3

lexical-analysis ×2

regex ×2

compiler-construction ×1

eof ×1

match ×1

utf-8 ×1

xml ×1