gpt4 book ai didi

javascript - 在 JISON 中解析单个产品

转载 作者:行者123 更新时间:2023-11-30 13:57:35 24 4
gpt4 key购买 nike

在 JISON 中,有没有办法为单个作品解析字符串?例如,这个原始解析器根据多个产品(例如 ary)定义了一个主 expressions

现在这会返回一个可以解析表达式的函数:

var parser = jison.Parser(bnf);
var str = "A(1-3,5)&B(1,2,3)"
var result = parser.parse(str) // this works

但我还想解析匹配单个作品的字符串,如 ary

var str = "1-3,5"
var result = parser.ary.parse(str) /// this does not work

这是一个删除了一些 Javascript 的示例语法:

%start expressions

/* language grammar */
%%

expressions: e EOF {...}
;

assign: ID LPAR ary RPAR
;

predicate: COUNT LPAR elist constraint RPAR { ... }
;

e : TN { $$ = {}; }
| predicate { $$ = $1; }
| e '&' e { $$ = _.merge({},$1,$3); }
| e '!' e { $$ = { "$or": [$1,$3]}; }
| '?' e { $$ = { "$not": $2 }; }
| '{' e '}' { $$ = $2; }
| assign { $$ = $1; }
;

/* Seguir desde aca. Esta es la unica expr que sigue jodiendo... */
elist: elist SEMI e { ... }
| e { ... }
;

constraint: SEMI comparator val { ... }
| SEMI val {... }
;

ary: val { $$ = [$1]; }
| ary "," val
;


val: NUMBER { $$ = +$1; }
| '-' NUMBER { $$ = - (+$2); }
| ID { $$ = $1; }
| STRING { $$ = $1; }
| NUMBER '-' NUMBER { $$ = _.range(+$1, +$3+1); }
| '(' ary ')' { $$ = $1; }
;

comparator: '$eq'
| '$lte'
| '$gte'
| '$gt'
| '$lt' { $$ = $1; }
;

最佳答案

将此功能添加到使用解析器生成器生成的解析器中真的很简单,无需过多考虑解析器生成器的工作原理。您所需要的只是一些额外的(假的)终端,一个用于您想要开始解析的每个非终端,以及一个用于每个新终端的新产品。

如果您可以在不跳过箍的情况下将词素注入(inject)到词法流中,这也会有所帮助,这对于 jison 来说当然是可能的,因为它允许您插入自己的自定义词法分析器,它可以注入(inject)终端,然后将调用传递给生成的词法分析器。 (如果您需要使用生成的词法分析器,那么如果您的词法分析器生成器允许启动条件,那么它仍然非常容易。您只需为每个注入(inject)的词法定义一个启动条件,它立即发出所需的终端,然后重置为标准启动条件以便解析实际输入。此策略有很多变体,具体取决于您可用的接口(interface)。)

基于以上内容,新语法将类似于:

start: old_start
| EXPR_TOKEN expr
| ARY_TOKEN ary
| ...

然后您只需注入(inject)正确的终端,解析器就会自动继续使用所需的非终端。

对于像 Jison 这样的语法是数据的解析器生成器,这种转换可以很容易地自动完成,所以你甚至不需要决定你对哪些非终端感兴趣。

(注意:这让您可以选择一个目标非终端,而不是一个目标生产。如果您想要将一个非终端的单个生产作为目标并具有多个生产,您需要将该生产复制到新的开始符号。)

关于javascript - 在 JISON 中解析单个产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56941464/

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