标签: lex

在lex中如何使yyin指向yacc中具有main函数的文件?

我将传递给yacc中main的参数存储在一个文件中.现在我希望lex从这个文件而不是终端读取它的输入.我知道我可以将yyin指向一个文件,yyin = fopen("fn","r");但只有当main在lex中时才有用.当我在yacc的main中使用这个yyin声明时,它会显示错误,所以请提出一些建议来克服这个问题.

c yacc lex flex-lexer

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

Haskell解析工具 - yacc:lex :: happy:?

因此,似乎Happy是Haskell中yacc的强大替代品.是否有同样强大的词法生成器来替换lex/flex?

parsing haskell yacc lex

9
推荐指数
2
解决办法
2303
查看次数

无法识别Lex中的单行注释

我在这个过程中学习lex,我正在为C语言生成令牌,并且我试图识别单行注释"//",但是我与分区运算符有冲突

[1-9][0-9]*|0x[0-9a-fA-F][0-9a-fA-F]*           return NUMBER;
[a-zA-Z][a-zA-Z0-9]*                            return IDENT;
/                                               {return DIVIDE;}

[ \t\r\n]
[//]
Run Code Online (Sandbox Code Playgroud)

但是当我运行示例并输入//它将它们识别为2个分区运算符时.我应该在哪里修改代码.有什么建议.

编辑:

Lex代码:

%{
#include "y.tab.h"
%}
%array
%%
if                                              {return IF;}
while                                           {return WHILE;}
else                                            {return ELSE;}
int                                             {return INT;}
return                                          {return RETURN;}
\/\/[^\r\n]*
[1-9][0-9]*|0x[0-9a-fA-F][0-9a-fA-F]*           return NUMBER;
[a-zA-Z][a-zA-Z0-9]*                            return IDENT;

[+]                                             {return ADD;}
[-]                                             {return SUB;}
[<]                                             {return LESS;}
[>]                                             {return GREAT;}
[*]                                             {return MULT;}
[/]                                             {return DIVIDE;}
[;]                                             {return SEMICOLON;}

\{                                              return LBRACE;
\}                                              return RBRACE;

[ \t\r\n]

\(                                              return LPAREN;

\)                                              return RPAREN;

. …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction lex

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

术语解析树和派生树之间的任何差异?

当引用符合语法的文本的解析结果时,术语AST(抽象语法树),解析树和派生树由不同的人围绕.假设我们正在谈论解析计算机语言,他们的差异是否足够小,我们可以互换使用这些术语?如果没有,我们如何正确使用这些条款?

grammar parsing lex abstract-syntax-tree

9
推荐指数
2
解决办法
6085
查看次数

lex/yacc和fslex/fsyacc有什么区别?

我正在学习F#,因为我想写一个词法分析器和解析器.我对这种处理有一点经验,但确实需要正确地学习它和F#.

在学习F#的lexing/parsing功能时,学习lex和yacc是否足够?

或者是否存在一些差异,这意味着lex/yacc的代码将无法与fslex和fsyacc一起使用?

f# yacc lex fsyacc fslex

8
推荐指数
2
解决办法
2286
查看次数

如何消除flex&bison的"主要"例程,以便将lexing和解析过程放入库中?

我正在研究一个解析json字符串的解析器,我想把它变成一个库.问题是,当我使用ld链接我写的库时,会出现一条错误消息:

main.o: In function `main':
main.c:(.text+0x0): multiple definition of `main'
json-parser.o:/build/buildd/flex-2.5.35/libmain.c:29: first defined here
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题..?谢谢.

parsing yacc lex bison flex-lexer

8
推荐指数
2
解决办法
3485
查看次数

Flex和Yacc - 找不到 - lfl?

嗨,我正在学习Lex和yacc.我创建了以下lex程序.

%{
#include <stdio.h>
%}

%%
[0123456789]+           printf("NUMBER\n");
[a-zA-Z][a-zA-Z0-9]*    printf("WORD\n");
%%
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下命令运行它:

  1. lex example1.l
  2. cc lex.yy.c -o example1 -ll

还尝试了cc lex.yy.c -o example1 -lfl

当我进入上面的第二个命令表单时,我收到错误:

D:\workdir\flexyacc\Test3>gcc lex.yy.c -o Test -lfl
C:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lfl
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我试过谷歌搜索这个错误但到目前为止没有运气.由于我是Lex编程的新手,我不知道如何解决这个问题.任何帮助将不胜感激.非常感谢提前.

yacc lex

8
推荐指数
4
解决办法
2万
查看次数

用于Common Lisp的Lexer和Parser生成器

你能为Common Lisp推荐lexer和解析器生成器吗?我在CLiki上看到了以下列表,但列表中的大多数都处于alpha阶段:

因此,如果您可以与他们分享您的好或坏经验或推荐其他替代方案将会有所帮助.我更喜欢一种类似于其他语言的传统lex/yacc工具的工具,但也欢迎使用其他方法.

parsing lex common-lisp

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

在 Lex 和 Yacc 中创建注释

如何在 Lex 和 Yacc 中发表评论?

到目前为止,我还没有尝试过 Yacc,但在 Lex 中我已经尝试过/* comment */and // comment,但这些都无法编译。我在 Mac 上,使用内置的 Lex 和 Yacc 编译器(或者可能是 X-Code 编译器,我不知道)。Lex 或 Yacc 或最好两者中注释的正确语法是什么?

yacc lex bison flex-lexer

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

JFlex将嵌套注释作为一个标记进行匹配

在Mathematica中,注释以#(*结尾开头,*)注释可以嵌套.我目前使用JFlex扫描注释的方法包含以下代码

%xstate IN_COMMENT

"(*"  { yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}

<IN_COMMENT> {
  "(*"        {yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}
  [^\*\)\(]*  {return MathematicaElementTypes.COMMENT;}
  "*)"        {yypopstate(); return MathematicaElementTypes.COMMENT;}
  [\*\)\(]    {return MathematicaElementTypes.COMMENT;}
  .           {return MathematicaElementTypes.BAD_CHARACTER;}
}
Run Code Online (Sandbox Code Playgroud)

方法yypushstateyypopstate定义为

private final LinkedList<Integer> states = new LinkedList();

private void yypushstate(int state) {
    states.addFirst(yystate());
    yybegin(state);
}
private void yypopstate() {
    final int state = states.removeFirst();
    yybegin(state);
}
Run Code Online (Sandbox Code Playgroud)

让我有机会跟踪我正在处理多少嵌套级别的评论.

不幸的是,这导致COMMENT一个注释的几个标记,因为我必须匹配嵌套的注释开始和注释结束.

问:是否有可能与JFlex的使用其API使用类似的方法yypushbackadvance()等,以在整个注释范围恰好返回一个道理,即使评论嵌套?

grammar comments lex jflex

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