我有输入文本块的命令和参数,每行一个,如
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吗?
我正在尝试使用Flex&Bison编写我的第一个解析器.在解析数字时,我正在尝试将它们的值保存到yylval结构中.问题是,yylval当词法分析器达到一个数字时为null,这会导致分段错误.
(相关混乱的观点:那为什么在大多数Flex的例子(如这里), yylval?是一个结构,而不是指向结构的指针我无法yylval在test.l承认没有%option bison-bridge,而选择做yylval一个指针.另外,我试图初始化yylval在maintest.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) 在“ Unix编程环境”一书中,该书依赖于为编写“ hoc”这一章中的一个例子(除了其中一个例子)之外的所有例子编写自己的词法分析器。
我真的很想在第一个示例hoc1中使用lex。当我尝试使用lex编写自己的程序时,直到出现语法错误,程序才会输出响应。
该代码可以在Unix编程环境网站上看到 ...
您好,我正在尝试制作一个简单的解析器并使用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) 我写了一个解析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) 如何在不使用%prec或%left的情况下在Bison中设置优先级和关联性?有没有办法在不需要的地方编写语法?
我创建了一个 lex 文件 test.l 并从中创建了 lex.yy.c,然后我用 gcc -g 标志编译
我正在链接它,并且在编译调用 yylex() 的其余代码时没有问题,但是,在 GDB 中,我似乎无法深入调用 yylex()。
我究竟做错了什么?我在 yylex() 方法本身中放置了断点,这导致 gdb 在我调用 yylex() 时停止,但从未在函数内部。
我是否需要使用调试符号或其他东西编译 -l 库?
我知道它正在运行,因为我用 -d 创建了我的 lex.yy.c 文件,所以我看到了接受令牌等的输出。
谢谢
我正在尝试从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) 考虑一下这个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) 我需要在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"
如何解决问题?