【问题标题】:PEGjs | Multiple output issue聚乙二醇 |多输出问题
【发布时间】:2021-12-08 08:46:45
【问题描述】:

为什么我们可以在 PEG.js 中输出一次? 有人知道实现许多输出的其他方法吗? 我正在使用堆栈????和一个函数,代码如下:

function evalStack() {
        for (var i = stack.length - 1; 0 <= i; i--) {
            stack[i]();
        }
        return result;
    }

我的自定义输入:

start
A=4;
A
B=8;
B

我预期的结果:

4
8

我得到的结果:

4

请帮帮我

【问题讨论】:

  • 我不明白 evalStack() 函数是做什么的?你究竟在哪里填写“结果”变量中的值?

标签: javascript parsing pegjs


【解决方案1】:

试试这个肮脏的解决方案:

all
  = _ ptp:putThenPrint+ _
  {
    var all = [];
    ptp.forEach(it => {
        all.push(it);
    });
    var r = []
    all.forEach(tp => {
      tp.toPrint.forEach(p => {
        r.push(tp.values[p])
      });
    });
    return "\n" + r.join("\n") + "\n";
  }
  
putThenPrint
  = _ mn:multiPutN _ pn:multiPrintN _ 
  {
    return {values:mn,toPrint:pn};
  }

multiPrintN
  = _ mp:printN+ _ 
  {
    var r = [];
    mp.forEach(it => {
        r.push(it);
    });
    return r;
  }

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

printN
  = _ n:varName _ nl+ {return n;}
  
varName
  = [a-zA-Z]+ {return text();}
  
n "integer number"
  = _ [0-9]+ { return parseInt(text(), 10); }
  
nl "new line"
  = [\n]

_ "whitespace or new line"
  = [ \t]*

在上面它只为您提供同一部分中变量的值,因此一旦您打印变量,您将无法再次打印它们但是如果您更改“all”块的语法中的 js 代码,您可以完整首先扫描然后打印所有变量,如果这是你想要的,但是你会在分配之前打印出值。正如我提到的,这只是一个肮脏的解决方案,需要优化和清理

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多