我将传递给yacc中main的参数存储在一个文件中.现在我希望lex从这个文件而不是终端读取它的输入.我知道我可以将yyin指向一个文件,yyin = fopen("fn","r");但只有当main在lex中时才有用.当我在yacc的main中使用这个yyin声明时,它会显示错误,所以请提出一些建议来克服这个问题.
因此,似乎Happy是Haskell中yacc的强大替代品.是否有同样强大的词法生成器来替换lex/flex?
我在这个过程中学习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) 当引用符合语法的文本的解析结果时,术语AST(抽象语法树),解析树和派生树由不同的人围绕.假设我们正在谈论解析计算机语言,他们的差异是否足够小,我们可以互换使用这些术语?如果没有,我们如何正确使用这些条款?
我正在学习F#,因为我想写一个词法分析器和解析器.我对这种处理有一点经验,但确实需要正确地学习它和F#.
在学习F#的lexing/parsing功能时,学习lex和yacc是否足够?
或者是否存在一些差异,这意味着lex/yacc的代码将无法与fslex和fsyacc一起使用?
我正在研究一个解析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)
我怎样才能解决这个问题..?谢谢.
嗨,我正在学习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)
我正在尝试使用以下命令运行它:
还尝试了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编程的新手,我不知道如何解决这个问题.任何帮助将不胜感激.非常感谢提前.
你能为Common Lisp推荐lexer和解析器生成器吗?我在CLiki上看到了以下列表,但列表中的大多数都处于alpha阶段:
因此,如果您可以与他们分享您的好或坏经验或推荐其他替代方案将会有所帮助.我更喜欢一种类似于其他语言的传统lex/yacc工具的工具,但也欢迎使用其他方法.
如何在 Lex 和 Yacc 中发表评论?
到目前为止,我还没有尝试过 Yacc,但在 Lex 中我已经尝试过/* comment */and // comment,但这些都无法编译。我在 Mac 上,使用内置的 Lex 和 Yacc 编译器(或者可能是 X-Code 编译器,我不知道)。Lex 或 Yacc 或最好两者中注释的正确语法是什么?
在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)
方法yypushstate和yypopstate定义为
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使用类似的方法yypushback或advance()等,以在整个注释范围恰好返回一个道理,即使评论嵌套?