簡體   English   中英

如何使用 javascript 編寫解析器?

[英]How to write a parser using javascript?

在我們的產品中,我們試圖從給定的文本中解析以下不同的格式 -

  1. ${{node::123456}}
  2. ${{node:123456}}
  3. $fn{{#functionName('abcd',',',' somethingWithASpace')}}
  4. $fn{{#functionName('abcd','#','${{node::123456}}')}}
  5. ${{rmtrqst:someText[]->abcd}}

文本示例如下 -

  1. Hi, how are you ${{node::123456}}? Your order id is ${{node::636636}}.

或者

  1. Your order was placed on $fn{{#dateConverterFunction('abcd','#','${{node::123456}}')}}

我嘗試使用正則表達式/\$((fn)\{{2}(\#|)(\w*)((\(.*\))|([^\$]*))\}{2})/gi - 但這並沒有多大幫助。 誰能建議我如何為此編寫解析器?

語法可能是這樣的 -

  1. 每個表達式都以 $ 開頭,后跟 fn{{ 或 {{
  2. 之后會有一個字符串,如 node 或 #functionName 或其他
  3. 后面可能是一個括號括起來的字符串(這可能包含整個表達式,如 ${{node::1234}} 里面 - 我們應該忽略括號內的任何內容
  4. 最后它會被 }} 關閉

使用分詞器,讓它將字符串分解為有意義的結構。

Near.js庫是解析像您這樣的非線性結構的流行選擇。 您可以選擇保持表達式簡單 - 或者,如果選擇其他方式,該庫可以為復雜的 grimmer 創建一個抽象語法樹。

要使用該庫編寫解析器,請在單獨的文件中定義您的詞匯表並將其用於解析。

或者您可以直接使用 tokanizer 將您的字符串 tokanized。

@{%
const moo = require("moo");

const lexer = moo.compile({
  ws:     /[ \t]+/,
  number: /[0-9]+/,
  word: /[a-z]+/,
  times:  /\*|x/
});
%}

# Pass your lexer object using the @lexer option:
@lexer lexer

# Use %token to match any token of that type instead of "token":
multiplication -> %number %ws %times %ws %number {% ([first, , , , second]) => first * second %}

# Literal strings now match tokens with that text:
trig -> "sin" %number

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM