Pegjs 预期 [0-9.] 或输入结束但找到 "a"
Pegjs Expected [0-9.] or end of input but "a" found
我想使用 pegjs 处理 string starts with number
。当我输入 1abcd 时,它会抛出 Expected [0-9.] or end of input but "a" found.
。预期输出为 { item: '1abcd', case: '=' }
。我需要什么改变?
var parser = peg.generate(`
start
= number:NUMBER { return { case: "=", item: number } }
/ string:STRING { return { case: "=", item: string.join("") } }
NUMBER
= number:[0-9\.]+ { return parseFloat(number.join("")); }
/ number:[0-9]+ { return parseInt(number.join(""), 10); }
STRING = string:[^*]+ { return string; }
`);
console.log(parser.parse("123"))
console.log(parser.parse("123.45"))
console.log(parser.parse("abcd"))
console.log(parser.parse("abcd-efgh"))
console.log(parser.parse("1abcd"))
输出如下:
{case: "=", item: 123}
{case: "=", item: 123.45}
{case: "=", item: "abcd"}
{case: "=", item: "abcd-efgh"}
沙盒:https://codesandbox.io/s/javascript-testing-sandbox-forked-5vekz?file=/src/index.js
由于 NUMBER
匹配第一个字符,您需要在返回成功匹配之前对 STRING
使用否定先行。这样,如果遇到 STRING
字符,NUMBER
规则将失败,并且将使用 start
的第二个交替。
这是一个示例,尽管正如@thinkgruen 所写,您可能还想尝试不那么松散地解析浮点数。
start
= number:NUMBER { return { case: "=", item: number } }
/ string:STRING { return { case: "=", item: string.join("") } }
NUMBER
= number:[0-9\.]+ (!STRING) { return parseFloat(number.join("")); }
/ number:[0-9]+ (!STRING) { return parseInt(number.join(""), 10); }
STRING = string:[^*]+ { return string; }
我想使用 pegjs 处理 string starts with number
。当我输入 1abcd 时,它会抛出 Expected [0-9.] or end of input but "a" found.
。预期输出为 { item: '1abcd', case: '=' }
。我需要什么改变?
var parser = peg.generate(`
start
= number:NUMBER { return { case: "=", item: number } }
/ string:STRING { return { case: "=", item: string.join("") } }
NUMBER
= number:[0-9\.]+ { return parseFloat(number.join("")); }
/ number:[0-9]+ { return parseInt(number.join(""), 10); }
STRING = string:[^*]+ { return string; }
`);
console.log(parser.parse("123"))
console.log(parser.parse("123.45"))
console.log(parser.parse("abcd"))
console.log(parser.parse("abcd-efgh"))
console.log(parser.parse("1abcd"))
输出如下:
{case: "=", item: 123}
{case: "=", item: 123.45}
{case: "=", item: "abcd"}
{case: "=", item: "abcd-efgh"}
沙盒:https://codesandbox.io/s/javascript-testing-sandbox-forked-5vekz?file=/src/index.js
由于 NUMBER
匹配第一个字符,您需要在返回成功匹配之前对 STRING
使用否定先行。这样,如果遇到 STRING
字符,NUMBER
规则将失败,并且将使用 start
的第二个交替。
这是一个示例,尽管正如@thinkgruen 所写,您可能还想尝试不那么松散地解析浮点数。
start
= number:NUMBER { return { case: "=", item: number } }
/ string:STRING { return { case: "=", item: string.join("") } }
NUMBER
= number:[0-9\.]+ (!STRING) { return parseFloat(number.join("")); }
/ number:[0-9]+ (!STRING) { return parseInt(number.join(""), 10); }
STRING = string:[^*]+ { return string; }