Javascript 生成的解析器对Node.js上的转义引号抛出错误
我正在使用创建包含解析字符串的解析器。Javascript 生成的解析器对Node.js上的转义引号抛出错误,javascript,node.js,parser-generator,peg,Javascript,Node.js,Parser Generator,Peg,我正在使用创建包含解析字符串的解析器。 包含任何类型字符的字符串都用引号括起来“,并且可能包含转义引号\” 到目前为止,我有以下规则: start = ["] string:(( '\\"' {return '"';} / [^"])*) ["] {return string.join('');} 它在中工作,并为给定的输入“abc\”def”生成“abc\”def” 为Node.js版本0.6.21和PEG.js版本0.7.0生成的解析器按以下方式执行 var res
包含任何类型字符的字符串都用引号括起来
“
,并且可能包含转义引号\”
到目前为止,我有以下规则:
start
= ["] string:(( '\\"' {return '"';} / [^"])*) ["]
{return string.join('');}
它在中工作,并为给定的输入“abc\”def”
生成“abc\”def”
为Node.js版本0.6.21和PEG.js版本0.7.0生成的解析器按以下方式执行
var result = parser.parse('"abc\"def"');
并产生以下错误:
{ name: 'SyntaxError',
expected: [],
found: 'd',
message: 'Expected end of input but "d" found.',
offset: 5,
line: 1,
column: 6 }
但是,使用\\“
而不是\”
可以成功地获得预期的输出
var result = parser.parse('"abc\\"def"'); // parses correctly
这个问题有什么解释或解决方法吗?
特别是,我不可能对解析器预期输入中的所有引号进行双转义。此语句中的字符串文字
var result=parser.parse('abc\'def');
…实际上不包含反斜杠。在JavaScript中,这个符号序列-\“
-”被解析为一个符号序列-“
-无论使用什么引号来分隔字符串-双引号还是单引号。JS不会在字符串中插入变量和表达式,它们之间基本上没有区别
这个字符串-
““abc\\”def”
-但是,它有一个反斜杠:它是由\\
序列编码的。请注意,不必使用另一个反斜杠来转义双引号本身(因为分隔符是单引号)。但是,如果使用了“\'abc\\\\'def\”
表单,则必须执行此操作。此语句中的字符串文字
var result=parser.parse('abc\'def')代码>
。。。实际上不包含反斜杠。在JavaScript中,此符号序列-\“
”被解析为单个符号-“
”-无论使用什么引号来分隔字符串-双引号还是单引号。JS不会在字符串中插入变量和表达式,它们之间基本上没有区别
这个字符串-““abc\\\”def”
-但是,它有一个反斜杠:它是由\\
序列编码的。请注意,没有必要使用另一个反斜杠来转义双引号本身(因为分隔符是单引号)。但是,如果使用了“\\\\\”abc\\\\\\”def\
表单,则必须使用反斜杠。谢谢,为了快速的回答。不过有一个问题。如果要解析的字符串的内容是从文件中读取的(例如,使用Node.js),是否会存在相同的问题。因为这是解析器的真正目的。上面的问题是在为解析器编写单元测试时出现的。您的意思是,如果文件本身包含abc\“def
行?不,\”
将被视为两个符号-现在它不是字符串文字(我承认我没有测试它,但这是唯一合理的方法)。是的,这就是我的意思。再次感谢,谢谢你的快速回答。不过有一个问题。如果要解析的字符串的内容是从文件中读取的(例如,使用Node.js),是否会存在相同的问题。因为这是解析器的真正目的。上面的问题是在为解析器编写单元测试时出现的。您的意思是,如果文件本身包含abc\“def
行?不,\”
将被视为两个符号-现在它不是字符串文字(我承认我没有测试它,但这是唯一合理的方法)。是的,这就是我的意思。再次感谢。