如何用 Peg.js 打开文件?

How open files with Peg.js?

如何用我的语言阅读文件?

我正在尝试了解语言是如何工作的。我想知道如何创建一个简单的语法来使用 Peg.js.
读取文件 在Python中是这样的

f= open("testfile.txt","w+")

Peg.js

中的语法示例
{
   var keywords = ["f=", "open"];
}

Expression =
    word:$(Word) { return { word: word } } /
    keyword:$(Keyword) { return { keyword: keyword } }

// Word will match everything except "f" and "open"
Word = word:$([a-zA-Z]+) &{ return !keywords.includes(word) }

Keyword = [a-zA-Z]+

start
  = f open symbol

open
  = attribute:',"w+"'? __ { return write; }
  = attribute:'include'? __ { return include; }

include
  = include : "'_ exp:[a-zA-Z]+ _'" _ { return include; }

symbol
  = '("' _ exp:[a-zA-Z]+ _ '")' { return [ exp.join('') ]; }

// optional whitespace
_  = [ \t\r\n]*

// mandatory whitespace
__ = [ \t\r\n]+

但是我得到这个错误:

Line 21, column 3: Expected "/", ";", comment, end of input, end of line, identifier, or whitespace but "=" found.

示例:Peg.js

f= open("testfile.txt","w+")

您收到语法错误,因为您对 open 的定义包含两个 =。我假设您希望第二个成为 /。然后 open 将匹配字符串 ,"w+" (或什么都不匹配)或 include.

但这不是您的代码中的唯一问题。以下是我注意到的其他一些内容:

  • 您的前三个规则与其他规则不相互使用。因此,如果您使用 Expression 作为开始规则(默认为第一个),则只有前三个规则很重要。如果您使用 start 作为起始规则,则前三个规则根本无关紧要。
  • 您在关键字数组中列出 "f=",然后检查匹配 [a-zA-Z]+ 的字符串是否在该数组中。但是 f= 不匹配那个模式,所以把它放在数组中是没有意义的。
  • 您将 start 定义为 f open symbol,但未在任何地方定义 f
  • "'_ exp:[a-zA-Z]+ _'" 匹配文字字符串 '_ exp:[a-zA-Z]+ _'。这几乎肯定不是你想要的。