我需要为不匹配的字符禁用 flex 输出。默认情况下,我无法禁用 ECHO(),也无法禁用 yyout。任何变体?
我真的不熟悉 lex/flex。我正在尝试调试一些遗留的 flex 代码。我想查看与特定规则匹配的文本。
例如。
[a-z]* {"some C code" "need to print the string that matched this rule"}
Run Code Online (Sandbox Code Playgroud)
例如。如果johndoe@xyz.com 是输入,我需要打印匹配的字符串,即johndoe
我尝试打印yytext,但它只显示第一个字符。
嘿,我最近参与了一个编译器开发,我遇到了减号(-)和负数(-1)的问题。假设现在我有5--3, 5+-3,如何编写语法规则,使得在抽象语法树构建过程中,yacc能够生成正确的抽象语法树?我的语法是这样的:
expr :
constant {}
| id {}
| exec_expr {}
exec_expr :
expr PLUS expr {}
| expr MINUS expr {}
| expr MUL expr {}
| expr DIV expr {}
我现在的想法是使用最高阶(非关联)的 UMINUS 符号来处理这种情况。不知何故,我们的编译器必须将表达式拆分为 expr 和 exec_expr,我已经尝试过该方法,但由于某些原因它不起作用。
用其他语言处理这种情况的标准解决方案是什么?特别是那些具有 LR(0) 自动机的。非常感谢!
如何在 Linux 上调试 LEX/FLEX 程序?编译和运行的代码如下:
lex example.l
gcc lex.yy.c -lfl
./a.out
<Enter your input>
Run Code Online (Sandbox Code Playgroud)
令牌是否-d可以调试 LEX/FLEX?如果是,我需要将其包含在代码中的哪一行进行编译?
下载并安装了最新版本的FlexSDK.将其解压缩到文件夹C:FlexSDK中.打开我的命令提示符到C:/ FlexSDK/bin.找到该文件夹的目录,我的mxmlc.exe文件就在那里.从命令提示符我发出mxmlc c:test.mxml并收到"找不到JVM"错误.这是令人惊讶的,因为我之前在我的计算机上从命令提示符编译了mxml文件.此外,我还在命令提示符之前开发,编译和运行了java程序.我知道我的系统上有一个JRE.事实上它位于"C:\ Program Files\Java\jre6".正如我之前所说,我已经编译了mxml文件.我不明白现在的问题是什么.
我有以下文件,需要解析
--TestFile
Start ASDF123
Name "John"
Address "#6,US"
end ASDF123
Run Code Online (Sandbox Code Playgroud)
开头的--行将被视为注释行.并且文件以"开始"开始并以end.结束.后面的字符串Start是UserID然后,name并且address将在双引号内.
我需要解析文件并将解析后的数据写入xml文件.
所以生成的文件就像
<ASDF123>
<Name Value="John" />
<Address Value="#6,US" />
</ASDF123>
Run Code Online (Sandbox Code Playgroud)
现在我正在使用模式匹配(Regular Expressions)来解析上面的文件.这是我的示例代码.
/// <summary>
/// To Store the row data from the file
/// </summary>
List<String> MyList = new List<String>();
String strName = "";
String strAddress = "";
String strInfo = "";
Run Code Online (Sandbox Code Playgroud)
方法:ReadFile
/// <summary>
/// To read the file into a List
/// …Run Code Online (Sandbox Code Playgroud) 我将在某些背景下提到这个问题:
我遇到的问题是在我的词法分析器中使用转义字符处理输入,我认为这可能与字符串的编码有关,但我不确定.
这是我在lexer中处理字符串文字的方式:
\"(\\.|[^\\"])*\"
{
char* text1 = strndup(yytext + 1, strlen(yytext) - 2);
char* text2 = "text\n";
printf("value = <%s> <%x>\n", text1, text1);
printf("value = <%s> <%x>\n", text2, text2);
}
Run Code Online (Sandbox Code Playgroud)
这输出如下:
value = <text\n"> <15a1bb0>
value = <text
> <7ac871>
Run Code Online (Sandbox Code Playgroud)
它似乎将换行符分别视为反斜杠后跟n.
这里发生了什么,如何处理文本与C输入相同?
我需要解析不同文件的源代码,每个文件用不同的语言编写,我想用C来做.
为了做到这一点,我正在考虑使用yacc/ lex,但我发现它们很难理解,可能是由于完全没有合适的文档(要么就是这样,要么它们真的很神秘).
所以我的问题是:我在哪里可以找到一些好的文档yacc/ lex,最好是教程样式的介绍?或者,有没有更好的方法在C中这样做?也许还有其他我可以使用的东西而不是yacc/ lex,甚至可能用不同的语言写的?
我有兴趣在我的flex文件中添加分号插入ala Google Go.
来自Go文档:
分号
与C一样,Go的正式语法使用分号来终止语句; 与C不同,这些分号不会出现在源代码中.相反,词法分析器使用一个简单的规则在扫描时自动插入分号,因此输入文本大多没有分号.
规则是这样的.如果换行符之前的最后一个标记是一个标识符(包括int和float64之类的单词),则是一个基本文字,例如数字或字符串常量,或者其中一个标记
Run Code Online (Sandbox Code Playgroud)break continue fallthrough return ++ -- ) }词法分析器总是在令牌后插入分号.这可以概括为"如果新行出现在可以结束语句的标记之后,则插入分号".
在结束括号之前也可以省略分号,所以语句如
Run Code Online (Sandbox Code Playgroud)go func() { for { dst <- <-src } }()不需要分号.Idiomatic Go程序仅在诸如for循环子句之类的地方使用分号,以分隔初始化程序,条件和继续元素.如果您以这种方式编写代码,它们也是分隔行上多个语句所必需的.
一个警告.你永远不应该把控制结构的开括号(if,for,switch或select)放在下一行.如果这样做,将在大括号之前插入分号,这可能会导致不良影响.写这样的
Run Code Online (Sandbox Code Playgroud)if i < f() { g() }不喜欢这个
Run Code Online (Sandbox Code Playgroud)if i < f() // wrong! { // wrong! g() // wrong! } // wrong!
我将如何进行此操作(如何在流中插入令牌,如何查看匹配的最后一个令牌以查看它是否是一个好主意等等)?
我也在使用野牛,但Go似乎只是用他们的词法分析器插入分号.
让我想要编程的第一件事就是创建一个多人文本游戏.当我意识到,至少在我看来,写一个智能解析器会有多复杂的时候,我很害怕这个概念.
所以现在我回过头来思考它,并且我试图对这个问题进行大量的研究.事实证明它似乎比我想象的要多得多,而且我偶然发现了诸如lexing,tokenizing和parsing之类的术语,只有我之前知道的后者.我认为词法分析领域是我想要寻找的.
因此,我没有尝试创建我自己的词法分析器和解析器,而这些词法分析器我读过很困难且容易出错,并且大多数人都指示远离它,我想我会找到一个好的词法分析器和解析器生成器来使用,这应该是对我来说,所有繁重的工作都可以集中在我想要的语法上.我也听过很多人说过想做这种事情的人应该简单地使用Inform.
当然,我猜Inform很酷,但C#是我选择的语言,我喜欢它让我对自己认为的Inform提供的自由.我对创建多人文本游戏的所有组件和框架比在任何一个特定的最终结果中更感兴趣,所以我喜欢最好使用标准编程语言的想法.
我一直试图为C#找一个好的词法分析器/解析器生成器一段时间,对于人们给出的评论而言似乎并没有真正满意.
C#的antlr似乎不发达,大多是事后的想法.我已经尝试过了解GPLEX和GPPG但是现在它们对我来说太混乱了,尽管阅读了很多文档并试图阅读很多关于lexing的内容.
我脑子里有很多关于lexing的整个过程的概念,但是当面对词法分析器和解析器时,我想我真的不知道这些应该如何被嵌入到我的实际代码中.
我想用名词短语和动词短语构建一个简单的英语语法,并且能够拥有名词和动词列表,这些名词和动词可以随着游戏的开发和扩展而从数据库中动态添加和准备.
我想我觉得我对这个问题的研究结果很不满意.
说实话,基于我研究的内容创建自己的词法分析器和解析器的概念的想法在这一点上比使用我读过的任何词法分析器/解析器生成器更具吸引力.