【发布时间】:2014-05-09 08:19:06
【问题描述】:
我被分配为Basic programming language 编写编译器。基本上,代码用新行或: 标记分隔。例如,遵循代码是有效的。
型号#1
10 PRINT "Hello World 1" : PRINT "Hello World 2"
型号#2
10 PRINT "Hello World 1"
20 PRINT "Hello World 2"
你可以测试那些here。
在我的编译器中解析代码之前,我需要做的第一件事是拆分代码。
我已经按行拆分代码,但我坚持要找到一个正则表达式来拆分以下代码示例:
以下代码示例应拆分为 2 个PRINT 代码。
10 PRINT "Hello World 1" : PRINT "Hello World 2"
但不要匹配这个:
以下代码示例是一个独立的命令。
10 PRINT "Hello World 1" ": PRINT Hello World 2"
问题
任何正则表达式模式都可以匹配上述第一个代码示例,其中: 在一对" 之外并且不匹配第二个?
有人可以帮我吗?
任何事情都会有所帮助。 :)
【问题讨论】:
-
你不应该用正则表达式解析这种结构。正则表达式只能匹配常规语言,这不适合您的问题。您应该改用 this 之类的构造。
-
@Mauren 确实如此。我最终会这样做,但首先我需要标记源代码,并净化代码(即删除 cmets 等......)。所以我相信我首先需要标记
:。 -
我建议您通过构建一个循环来进行标记化,在该循环中查看每个字符并确定它属于哪个标记,而不是通过正则表达式进行。请查看之前链接的源代码的第 86 行。
-
@Mauren 谢谢,这是一个巨大的帮助:)
-
@Mauren:我同意“完整的”正则表达式解决方案不是此类任务的最佳方式,但是,不要相信像 boost(或其他现代正则表达式工具)这样的库) 无法匹配非正则语言。我们离理论上的考虑和 POSIX 正则表达式引擎的能力还很远。
标签: c++ regex boost basic compiler-construction