Как открывать файлы с помощью 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]+

Но я получаю эту ошибку:

Строка 21, столбец 3: ожидается "/", ";", комментарий, конец ввода, конец строки, идентификатор или пробел, но найдено "=".

Образец: Peg.js

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

person Community    schedule 22.08.2019    source источник


Ответы (1)


Вы получаете синтаксическую ошибку, потому что ваше определение open содержит два =. Я предполагаю, что вы хотите, чтобы второй был / вместо этого. Тогда open будет соответствовать либо строке ,"w+" (или ничего), либо include.

Однако это не единственная проблема в вашем коде. Вот некоторые другие, которые я заметил:

  • Ваши первые три правила и остальные правила не используют друг друга. Поэтому, если вы используете Expression в качестве начального правила (по умолчанию, поскольку оно идет первым), будут иметь значение только первые три правила. И если вы используете start в качестве начального правила, первые три правила вообще не будут иметь значения.
  • Вы перечисляете "f=" в своем массиве ключевых слов, а затем проверяете, есть ли в этом массиве строка, соответствующая [a-zA-Z]+. Но f= не соответствует этому шаблону, поэтому наличие его в массиве бессмысленно.
  • Вы определяете start как f open symbol, но f нигде не определено.
  • "'_ exp:[a-zA-Z]+ _'" соответствует буквальной строке '_ exp:[a-zA-Z]+ _'. Это почти наверняка не то, что вы хотите.
person sepp2k    schedule 23.08.2019