次のようなファイルを解析するために、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
端子記号にはEOF
、INPATH
、 、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) }
;
明らかに、私はまだ終わっていません。私は現在、同時にいくつかのことに行き詰まっています。
行き詰まっていること
- 空行をスキップできること。
- 、、、
INPATH
およびSPACE
のトークンOUTPATH
化。 - 右再帰とは対照的に、言語文法セクションで左再帰を使用します (違いは何ですか? 私はそれを正しく行っていますか? ここで最良のオプションは何ですか?)。
言い換えれば、私は自分が何をしているのか分からず、実際に助けが必要なのです。
編集さらに調査を行い、最終的には自分の質問に答えたいと思います。