gpt4 book ai didi

javascript - 使用 Jison 创建/翻译简单的脚本到另一种语言

转载 作者:行者123 更新时间:2023-11-29 10:43:40 25 4
gpt4 key购买 nike

一直在与 Jison 一起尝试为非常简单的脚本语法创建一个“解释器”(这只是为了个人项目,而不是商业案例!)

自从我不得不创建一个编译器以来,已经有大约 20 年了,我想我只是没有掌握其中的一些概念。

我想做的是给 Jison 一个包含非常简单的语句的程序,每行一条语句,然后返回一个 Javascript 语句流,然后执行这些语句。

我可能看错了 - 也许我需要在解析期间实际执行操作?但这听起来不对。

无论如何,我得到的是(顺便说一句,我正在在线尝试这个 http://zaach.github.io/jison/try/)

/* lexical grammar */
%lex
%options case-insensitive
%%

\s+ /* skip whitespace */
is\s+a\b return 'OCREATE'
is\s+some\b return 'ACREATE'
[_a-zA-Z]+[_a-zA-Z0-9]*\b return 'IDENTIFIER'
<<EOF>> return 'EOF'

/lex

/* operator associations and precedence */

%start input

%% /* language grammar */

input
: /* empty */
| program EOF
{ return $1; }
;

program
: expression
{ $$ = $1; }
| program expression
{ $$ = $1; }
;

expression
: IDENTIFIER OCREATE IDENTIFIER
{ $$ = 'controller.createOne(\'' + $1 + '\', \'' + $3 + '\');' }

| IDENTIFIER ACREATE IDENTIFIER
{ $$ = 'controller.createSeveral(\'' + $1 + '\', \'' + $3 + '\');' }
;

因此,对于输入:

basket is some apples
orange is a fruit

...我想要:

controller.createSeveral('basket', 'apples');
controller.createOne('orange', 'fruit');

我得到的是:

controller.createSeveral('basket', 'apples');

这种获得单一结果对我来说很有意义,但我不知道如何构建我的输出。

最佳答案

问题出在您为 program 制作的第二部作品中:

program
: expression
{ $$ = $1; }
| program expression
{ $$ = $1; }

第二个产品基本上说的是“一个程序可以是一个(较短的)程序后跟一个表达式,但它的语义值是较短程序的值。”

您显然希望程序的值增加表达式的值,因此您需要这样说:

program
: expression
{ $$ = $1; }
| program expression
{ $$ = $1.concat($2); }

(或者 $$ = $1 + $2 如果您愿意的话。您可能需要换行以提高可读性。)

关于javascript - 使用 Jison 创建/翻译简单的脚本到另一种语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23911974/

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