gpt4 book ai didi

node.js - PEGjs:如果浮点规则失败,则回退(回溯?)到字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:34 24 4
gpt4 key购买 nike

我有一个 atom 规则,它尝试首先将所有内容解析为数字或带引号的字符串,如果失败,则将其视为字符串。

一切解析都很好,除了一个特殊情况,即这个非常具体的字符串:

DUD 123abc

无法解析 预期的“”,“。”或 [0-9] 但找到“a”。 错误。

我的期望:它应该成功解析并返回字符串“123abc”作为字符串原子。你可以在下面的语法内容中看到我的几次不成功的尝试都被注释掉了。

任何帮助/提示/指示/建议表示赞赏!

<小时/>

您可以尝试 online PEG.js version 上的语法。我正在使用 Node v0.8.23 和 pegjs 0.7.0

正确解析的数字:

  • `123
  • `0
  • `0。
  • `1。
  • `.23
  • `0.23
  • `1.23
  • `0.000
  • . <--- 作为字符串,不是数字,也不是错误

我希望将 123abc 解析为字符串,这可能吗?

<小时/>

这是我的整个语法文件:

start = lines:line+ { return lines; }

// --------------------- LINE STRUCTURE
line = command:command eol { return command; }

command = action:atom args:(sep atom)*
{
var i = 0, len = 0;

for (var i = 0, len = args.length; i < len; i++) {
// discard parsed separator tokens
args[i] = args[i][1];
}

return [action, args];
}

sep = ' '+
eol = "\r" / "\n" / "\r\n"

atom = num:number { return num; }
/ str:string_quoted { return str; }
/ str:string { return str; }

// --------------------- COMMANDS

// TODO:

// --------------------- STRINGS
string = chars:([^" \r\n]+) { return chars.join(''); }

string_quoted = '"' chars:quoted_chars* '"' { return chars.join(''); }
quoted_chars = '\\"' { return '"'; }
/ char:[^"\r\n] { return char; }

// --------------------- NUMBERS
number = integral:('0' / [1-9][0-9]*) fraction:("." [0-9]*)?
{
if (fraction && fraction.length) {
fraction = fraction[0] + fraction[1].join('');
} else {
fraction = '';
}

integral = integral instanceof Array ?
integral[0] + integral[1].join('') :
'0';

return parseFloat(integral + fraction);
}
/ ("." / "0.") fraction:[0-9]+
{
return parseFloat("0." + fraction.join(''));
}

/*
float = integral:integer? fraction:fraction { return integral + fraction; }

fraction = '.' digits:[0-9]* { return parseFloat('0.' + digits.join('')); }

integer = digits:('0' / [1-9][0-9]*)
{
if (digits === '0') return 0;
return parseInt(digits[0] + digits[1].join(''), 10);
}

*/

最佳答案

通过添加 !([0-9\.]+[^0-9\.]) 解决了这个问题,这有点像 number 规则的前瞻。

我知道 atom 规则将匹配,因此它有效的作用是使 number 规则更快失败。希望这可以帮助将来遇到不明确案例的人。

所以数字规则现在变成:

number = !([0-9\.]+[^0-9\.]) 积分:('0'/[1-9][0-9]*) 分数:("."[0-9]*)?

关于node.js - PEGjs:如果浮点规则失败,则回退(回溯?)到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16081737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com