在解析期间检测内容中的正则表达式

时间:2010-05-26 19:21:32

标签: javascript c++ perl language-agnostic parsing

我正在为C编写一个简单的解析器。我只是用其他一些语言文件运行它(为了好玩 - 看看C-like和laziness的程度 - 如果我不想为每种语言编写单独的解析器可以避免它)。

然而,如果被解析的代码包含正则表达式,解析器似乎会分解JavaScript ...

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

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

'(','['etc匹配作为新范围的起点,可能永远不会被关闭。

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

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

//作为评论匹配...

如何在“类C”程序文件的内容文本中检测正则表达式?

2 个答案:

答案 0 :(得分:4)

这是不可能的。

拿这个,例如:

m =~ s/a/b/g;

可以是C或perl。

一分钟的思考表明,perl风格的正则表达式的数量也是无限有效的C表达式。

另一个例子:

m+foo *bar[index]+i

你能得到的最好的是一些极端模糊的猜测。困难源于这样一个事实,即正则表达式是一系列几乎可以实现所有内容的字符。

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

答案 1 :(得分:1)

好吧,你的令牌语法必须考虑正则表达式语法。经典解析器由两层组成:标记化输入,然后解析语法。语言的语法通常用标记表示,因此标记生成器的工作是将它们的流提供给解析器。一般来说,自己的标记是正则表达式,或者更恰当地说是一个很好的大的正则表达式。在输入的每个字符位置,其中一个令牌正则表达式必须匹配,否则该字符无效。

现在,还有其他解析技术可以将标记化与解析混合在一起。 (例如“PEG”解析器)

编辑 - 另一个注意事项:您无法使用正则表达式解析Javascript或Perl等语言。