首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在分析器中实现变量( PEGjs )

在分析器中实现变量( PEGjs )
EN

Stack Overflow用户
提问于 2021-10-21 12:48:42
回答 2查看 142关注 0票数 1

我是PEGjs的初学者,我需要帮助来实现对解析器的变量(标识符)声明支持。

我的输入代码如下所示:

代码语言:javascript
复制
a=4;
print a

我的PEGjs语法:

代码语言:javascript
复制
start
=(line)*
line
=left:var"="right:integer";" {left=right;}
/ 
print middle:var {return middle;}
print
="print"
var
=(a-zA-z)+
Integer "integer"
= _ [0-9]+ { return parseInt(text(), 10); }

预期产出:4

请帮帮我。#感恩节前进

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-22 12:14:01

试试这个:

代码语言:javascript
复制
all
  = _ mn:multiPutN _ pn:printN _ 
  {
    return mn[pn];
  }

multiPutN
  = mp:putN+ _ 
  {
    var r = {};
    mp.forEach(it => {
        r[it[0]]=it[1];
    });
    return r;
  }
  
putN
  = vn:varName _ "=" _ nn:n _ ";" { return [vn, nn]}

printN
  = print _ n:varName _ {return n;}
  
varName
  = [a-zA-Z]+ {return text();}
  
print 
  ="print"

n "integer number"
  = _ [0-9]+ { return parseInt(text(), 10); }
  
_ "whitespace or new line"
  = [ \t\n\r]*

所以上面的代码也支持多个变量,但只能打印一个变量。我在您的示例中编写了语法,所以在赋值变量值时,需要将";“放在末尾,但是打印var时不需要这样做。

票数 2
EN

Stack Overflow用户

发布于 2022-08-01 07:22:46

我从@digital的代码开始,得到了这个(仅在佩吉上测试):

代码语言:javascript
复制
{
const vars = {};
const result = [];
}

lines = (line _)* { return result; }

line 
  = set 
  / print

set = v:varName _ "=" _ num:n _ ";" { vars[v] = num; }
  
print = "print" _ v:varName { result.push(vars[v]); }
  
varName = $[a-zA-Z]+
  
n "integer number" = num:$[0-9]+ { return parseInt(num, 10); }
  
_ "whitespace or new line" = [ \t\n\r]*

它应该处理多个变量、多个打印语句和与变量交织的打印语句。请注意,{}中的代码块是为解析器的每次运行执行的,因此这些变量不会干扰其他运行。

输入:

代码语言:javascript
复制
a=4;
print a
print b
b=5;
print b
a=6;
print a

输出:

代码语言:javascript
复制
[
  4,
  undefined,
  5,
  6
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69662293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档