嗨,我在CFG中很幼稚,我正在尝试为我的表达式编写一个语法,但我在解析nearley输入值中的字符串时遇到了一个问题。
下面是我的表达式
"(I have a person: where "1+1=2")"下面是我的语法:
main -> statement {% id %}
statement -> "(" constline optional:? ")"
constline -> "I have a person" {% id %}
optional -> ":where" _ "\"" whereclause "\"" _ {%d=>d[2]%}
whereclause -> _ expression _ compare _ expression {%d=> d[0]+d[1]+d[3]%}
expression -> numbers "+" numbers {% d=>d[0]+d[1]+d[2]%}
| numbers "-" numbers {% d=>d[0]+d[1]+d[2]%}
numbers -> digit
| digit numbers {% d=> d[0]+d[1]%}
digit -> [0-9]
_ -> [\t]:*现在,在解析时,我得到了下面的错误::where "1+1=2")
Unexpected "\"". Instead, I was expecting to see one of the following:
A character matching /[0-9]/ based on:
digit -> /[0-9]/
numbers-> digit 请帮帮忙
发布于 2021-09-25 21:04:25
您的语法缺少使lexer正常工作的正则表达式,因此它无法理解大部分语法。此外,您还遗漏了比较闭包,我相信在我们的例子中它的意思是'=‘。我想这个应该可以了。
@{%
const moo = require('moo');
let lexer = moo .compile({
//string: /"(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*"/,
numbers: /[0-9]+/,
'"': '"',
'I have a person': 'I have a person',
'(': '(',
')': ')',
':': ':',
'+': '+',
'=': '=',
'=': '=',
ws: /[ \t]/,
'where': 'where',
});
console.clear();
%}
@lexer lexer
main -> "\"" statement "\"" {% d => d[1] %}
statement -> "(" constline optional:? ")"
constline -> "I have a person" {% id %}
optional -> ":" _ "where" _ expressionString _ {%d=>d[3]%}
whereclause -> _ expressionString _ compare _ expressionString {%d=> d[0]+d[1]+d[3]%}
expressionString -> "\"" expression "\"" {% d => d[1] %}
expression -> numbers "+" numbers "=" numbers {% d=>d[0]+d[1]+d[2]%}
| numbers "-" numbers "=" numbers {% d=>d[0]+d[1]+d[2]%}
numbers -> digit {% id %}
| digit numbers {% d=> d[0]+d[1]%}
digit -> [0-9]
_ -> [ \t]:*
如果这对你有效,请告诉我。
https://stackoverflow.com/questions/66225942
复制相似问题