2010-05-26 51 views
3

我写一个简单的解析器C.我正和一些其他语言文件运行它(的乐趣检测内容的正则表达式 - 看到的C-肖像和懒惰的程度 - 不想真写如果我可以避免它,则为每种语言分别分析解析器)。期间解析

但是解析器似乎打破了JavaScript的,如果被解析的代码中包含正则表达式...

案例1: 例如,在解析JavaScript代码段,

var phone="(304)434-5454" 
phone=phone.replace(/[\(\)-]/g, "") 
//Returns "3044345454" (removes "(", ")", and "-") 

的“(”,“[”等得到匹配的新的范围首先,它可能永远不会被关闭

案例2: 而且,对于Perl代码片断,

# Replace backslashes with two forward slashes 
# Any character can be used to delimit the regex 
$FILE_PATH =~ [email protected]\\@//@g; 

的//被匹配的评论...

我怎样才能检测到“C类”程序文件的内容文本内的正则表达式?

+2

为什么你关心你正在做匹配的字符串是否包含正则表达式运算符字符?您不会从输入执行正则表达式模式,您可以在输入时执行它们。 – 2010-05-26 19:24:05

+3

究竟你在试图解析什么?为什么'//'会在Perl中被标记为注释?解析器通常是为定义的语言编写的。 – 2010-05-26 19:24:45

+0

@David Thornley:解析器是为C编写的。 – sonofdelphi 2010-05-26 19:33:30

回答

4

这是不可能的。

籍此,例如:

m =~ s/a/b/g; 

可以既是C或Perl的。

一分钟的想法表明,也是有效的C表达式的perl样式正则表达式的数量是无限的。

又如:

m+foo *bar[index]+i 

你能得到的最好的是一些极端模糊的猜测。困难源于这样的事实:正则表达式是一系列可以几乎是一切的角色。

你最好清理你的错误处理。如果缺少一些括号或者看到多余的括号,分析器不应该“分解”。

+0

当然。会做到这一点。 :) – sonofdelphi 2010-05-28 06:07:45

1

那么,你的令牌语法必须采取正则表达式的语法考虑。经典解析器由两层构成:tokenize输入,然后解析语法。该语言的语法通常用标记表示,因此标记器的工作是将这些标记的流供给解析器。一般来说,这些令牌本身就是正则表达式,或者更恰当地说,它们是事物的一个伟大的正则表达式。在输入的每个字符位置,其中一个令牌正则表达式必须匹配,否则该字符无效。

现在,还有其他的解析技术嘎吱一起解析标记化排序的那个。 (例如“PEG”解析器)

编辑 —另一个注意事项:不能使用正则表达式解析Javascript或Perl等语言。

+0

我不想用正则表达式来解析语言。 – sonofdelphi 2010-05-26 19:35:03

+0

所以我想我将不得不为每种语言使用单独的正则表达式语法。 – sonofdelphi 2010-05-26 19:35:47

+0

是的,通常每种语言都有自己的标记规则,尽管有时他们无聊可以分享。 – Pointy 2010-05-26 19:38:43