0

次のようなファイルを解析するために、Jison (Bison の node.js 実装) を使用してパーサーを構築しようとしています。

---
Redirect Test Patterns
---

one.html /two/
one/two.html /three/four/
one /two
one/two/ /three
one/two/ /three/four
one/two /three/four/five/
one/two.html http://three.four.com/
one/two/index.html http://three.example.com/four/
one http://two.example.com/three
one/two.pdf https://example.com
one/two?query=string /three/four/
go.example.com https://example.com

目標

これは、リダイレクト パス/URL を格納するファイルです。ユーザーをリダイレクトする方法を知る必要がある場合に、このファイルを参照する他のスクリプトがあります。目標は、誰かがファイルを保存しようとするたびに実行できるパーサーを開発することです。そうすれば、常に適切にフォーマットされていることを確認できます。

基本的に、---ブロック内のすべてと空行は無視されます。残りの各行は、「リダイレクト レコード」を表します。

「リダイレクト レコード」ごとに、次の構造が必要です。

INPUT_URL_OR_PATH <space> OUTPUT_URL_OR_PATH

つまり、2 つの文字列を区切るには単一のスペースが必要です。

これまでに行ったこと

私は文法/解析に非常に慣れていないので、ご容赦ください。

私がスケッチした言語文法は次のようになります。

file -> lines EOF

lines -> record
lines -> lines record

record -> INPATH SPACE OUTPATH

端子記号にはEOFINPATH、 、SPACE、が含まれOUTPATHます。

残念ながら、レクサーの開発に問題があるため、まだ実装できる段階にありません。

これは私のjisonファイルがどのように見えるかです:

/* description: Parses a list of redirects */

/* lexical grammar */
%lex

%x comment

%%

"---"                 this.begin("comment")
<comment>"---"        this.popState()
<comment>[\n]         /* skip new lines */
<comment>.            /* skip all characters */

[ \t\n]               /* do nothing */
(\w+)                 return 'WORD'
<<EOF>>               return 'EOF'
.                     /* do nothing */

/lex

/* operator associations and precedence */

/* n/a */

%start file

%% /* language grammar */

file
  : lines EOF
      { console.log($1); return $1; }
  | EOF
      { const msg = 'The target file is empty';
        console.log(msg);
        return msg; }
  ;

lines
  : lines WORD
      { console.log('WORD ', $2) }
  | WORD
      { console.log('WORD ', $1) }
  ;

明らかに、私はまだ終わっていません。私は現在、同時にいくつかのことに行き詰まっています。

行き詰まっていること

  1. 空行をスキップできること。
  2. 、、、INPATHおよびSPACEのトークンOUTPATH化。
  3. 右再帰とは対照的に、言語文法セクションで左再帰を使用します (違いは何ですか? 私はそれを正しく行っていますか? ここで最良のオプションは何ですか?)。

言い換えれば、私は自分が何をしているのか分からず、実際に助けが必要なのです。

編集さらに調査を行い、最終的には自分の質問に答えたいと思います。

4

0 に答える 0