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

Javascript 解析期间检测内容中的正则表达式,javascript,c++,perl,language-agnostic,parsing,Javascript,C++,Perl,Language Agnostic,Parsing,我正在为C编写一个简单的解析器。我只是在用其他一些语言文件运行它(为了好玩——看看C相似性和惰性的程度——如果可以避免的话,我不想为每种语言编写单独的解析器) 但是,如果正在解析的代码包含正则表达式,则JavaScript的解析器似乎会崩溃 案例1: 例如,在解析JavaScript代码段时 var phone="(304)434-5454" phone=phone.replace(/[\(\)-]/g, "") //Returns "3044345454" (removes "(", ")"

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

但是,如果正在解析的代码包含正则表达式,则JavaScript的解析器似乎会崩溃

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

var phone="(304)434-5454"
phone=phone.replace(/[\(\)-]/g, "") 
//Returns "3044345454" (removes "(", ")", and "-")
 # Replace backslashes with two forward slashes
 # Any character can be used to delimit the regex
 $FILE_PATH =~ s@\\@//@g; 
“(”、“[”等作为新作用域的开始符进行匹配,新作用域可能永远不会关闭

案例2: 对于Perl代码片段

var phone="(304)434-5454"
phone=phone.replace(/[\(\)-]/g, "") 
//Returns "3044345454" (removes "(", ")", and "-")
 # Replace backslashes with two forward slashes
 # Any character can be used to delimit the regex
 $FILE_PATH =~ s@\\@//@g; 
//将作为注释进行匹配


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

好吧,您的标记语法必须考虑正则表达式语法。经典解析器由两层组成:一层用于标记输入,另一层用于解析语法。语言的语法通常用标记表示,因此标记器的工作是将这些标记流提供给解析器。通常,标记本身是正则表达式,或者更恰当地说,是一个很大的正则表达式。在输入上的每个字符位置,其中一个标记正则表达式必须匹配,否则该字符无效

现在,还有其他一些解析技术可以将标记化和解析结合在一起

编辑-另一个注意事项:不能仅用正则表达式解析Javascript或Perl之类的语言。

这是不可能的

举个例子:

m =~ s/a/b/g;
m+foo *bar[index]+i
可以是C或perl

一分钟的思考表明,同样是理论上有效的C表达式的perl风格正则表达式的数量是无限的

另一个例子:

m =~ s/a/b/g;
m+foo *bar[index]+i
你能得到的最好结果是一些极端模糊的猜测。困难源于这样一个事实:正则表达式是一个字符序列,几乎可以是所有的字符


您最好清理错误处理。解析器不应“崩溃”如果缺少一些括号或看到多余的括号。

为什么您要关心进行匹配的字符串是否包含正则表达式运算符字符?您不从输入中执行正则表达式模式,而是在输入中执行它们。您到底想解析什么,以及解析成什么?为什么
/
会被标记为逗号Perl中的nt?解析器通常是为定义的语言编写的。@David Thornley:解析器是为C编写的。感谢您的编辑。它们极大地改进了问题。但是,我仍然不知道您为什么要这样做。C解析器虽然很复杂,但试图让它检测来自其他语言的正则表达式会让它变得更复杂更复杂,可能会导致某些C语言出错。我这里没有想法。>为什么要这样做?懒惰。;)我真的不想为每种语言编写单独的解析器,有很多重叠!我很惊讶C解析器在C和Java上运行得相当好(因为我所做的只是符号识别)我不想用一个正则表达式来解析这些语言。所以我想我必须对每种语言使用单独的正则表达式语法。是的,通常每种语言都有自己的标记规则,尽管有时它们很无聊,很难共享。我要简单一点:你不能解析Perl。或者,更准确地说,你不能静态解析Perl.PPI“不过,这很接近。”迈克尔·卡曼(Michael Carman)JavaScript呢?它能静态解析吗?