使用Jison(或Bison)对字符串进行标记和解析

时间:2017-01-22 09:21:51

标签: javascript parsing bison jison

我试图用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

终端符号包括:EOFINPATHSPACEOUTPATH

不幸的是,我甚至不能实现这一点,因为我在开发我的词法分析器时遇到了麻烦。

这就是我的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. 标记INPATHSPACEOUTPATH和;
  3. 在语法语法部分使用左递归而不是右递归(差异是什么?我甚至做得对吗?这里最好的选择是什么?)。
  4. 换句话说,我不知道我在做什么,可以真正使用一些帮助。

    编辑我打算尝试做更多的研究,希望最终回答我自己的问题。

0 个答案:

没有答案