【问题标题】:How open files with Peg.js?如何使用 Peg.js 打开文件?
【发布时间】:2019-12-28 02:49:06
【问题描述】:

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

我试图了解语言是如何工作的。我想知道如何使用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]+

但我收到此错误:

第 21 行,第 3 列:应为“/”、“;”、注释、输入结尾、行尾、标识符或空格,但找到“=”。

示例:Peg.js

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

【问题讨论】:

    标签: javascript parsing compiler-construction peg


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多