我正在为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”程序文件的内容文本中检测正则表达式?
答案 0 :(得分:4)
这是不可能的。
拿这个,例如:
m =~ s/a/b/g;
可以是C或perl。
一分钟的思考表明,perl风格的正则表达式的数量也是无限有效的C表达式。
另一个例子:
m+foo *bar[index]+i
你能得到的最好的是一些极端模糊的猜测。困难源于这样一个事实,即正则表达式是一系列几乎可以实现所有内容的字符。
您最好清理错误处理。如果缺少某些括号或者看到多余的括号,解析器不应该“分解”。
答案 1 :(得分:1)
好吧,你的令牌语法必须考虑正则表达式语法。经典解析器由两层组成:标记化输入,然后解析语法。语言的语法通常用标记表示,因此标记生成器的工作是将它们的流提供给解析器。一般来说,自己的标记是正则表达式,或者更恰当地说是一个很好的大的正则表达式。在输入的每个字符位置,其中一个令牌正则表达式必须匹配,否则该字符无效。
现在,还有其他解析技术可以将标记化与解析混合在一起。 (例如“PEG”解析器)
编辑 - 另一个注意事项:您无法使用正则表达式解析Javascript或Perl等语言。