javascript – 使用PEG.js解析缩进级别

前端之家收集整理的这篇文章主要介绍了javascript – 使用PEG.js解析缩进级别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我与 PEG for Python style indentation基本相同的问题,但是我想要对 this answer有更多的方向.

答案成功地生成一系列字符串,每行的输入行之间有“INDENT”和“DEDENT”.似乎他几乎使用PEG.js来标记,但是并没有真正的解析.

那么如何扩展他的例子来做一些实际的解析?

例如,如何更改此语法:

  1. start = obj
  2. obj = id:id children:(indent obj* outdent)?
  3. {
  4. var o = {};
  5. o[id] = children[1];
  6. return (children[1] ? o : id);
  7. }
  8. id = [a-z]
  9. indent = '{'
  10. outdent = '}'

使用缩进而不是大括号来划分块,并且仍然得到相同的输出

(使用http://pegjs.majda.cz/online使用以下输入测试语法:a {bcd {zyx {}}})

解决方法

分析器:
  1. // do not use result cache,nor line and column tracking
  2.  
  3. { var indentStack = [],indent = ""; }
  4.  
  5. start
  6. = INDENT? l:line
  7. { return l; }
  8.  
  9. line
  10. = SAMEDENT line:(!EOL c:. { return c; })+ EOL?
  11. children:( INDENT c:line* DEDENT { return c; })?
  12. { var o = {}; o[line] = children; return children ? o : line.join(""); }
  13.  
  14. EOL
  15. = "\r\n" / "\n" / "\r"
  16.  
  17. SAMEDENT
  18. = i:[ \t]* &{ return i.join("") === indent; }
  19.  
  20. INDENT
  21. = &(i:[ \t]+ &{ return i.length > indent.length; }
  22. { indentStack.push(indent); indent = i.join(""); pos = offset; })
  23.  
  24. DEDENT
  25. = { indent = indentStack.pop(); }

输入:

  1. a
  2. b
  3. c
  4. d
  5. z
  6. y
  7. x

输出

  1. {
  2. "a": [
  3. "b","c",{
  4. "d": [
  5. "z","y","x"
  6. ]
  7. }
  8. ]
  9. }

它不能解析一个空的对象(最后一个x),但它应该很容易解决.这里的诀窍是SAMEDENT规则,当缩进级别没有改变时,它成功. INDENT和DEDENT更改当前缩进级别,而不改变文本pos = offset中的位置.

猜你在找的JavaScript相关文章