我试图用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
换句话说,将两个字符串分隔开来。
我是语法/解析的新手,所以请耐心等待。
我勾勒出的语法语法如下:
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
和; 换句话说,我不知道我在做什么,可以真正使用一些帮助。
编辑我打算尝试做更多的研究,希望最终回答我自己的问题。