![](/img/trans.png)
[英]How do you write an arithmetic expression parser in JavaScript, without using eval or a constructor function?
[英]How to write a parser using javascript?
在我們的產品中,我們試圖從給定的文本中解析以下不同的格式 -
${{node::123456}}
${{node:123456}}
$fn{{#functionName('abcd',',',' somethingWithASpace')}}
$fn{{#functionName('abcd','#','${{node::123456}}')}}
${{rmtrqst:someText[]->abcd}}
文本示例如下 -
Hi, how are you ${{node::123456}}? Your order id is ${{node::636636}}.
或者
Your order was placed on $fn{{#dateConverterFunction('abcd','#','${{node::123456}}')}}
我嘗試使用正則表達式/\$((fn)\{{2}(\#|)(\w*)((\(.*\))|([^\$]*))\}{2})/gi
- 但這並沒有多大幫助。 誰能建議我如何為此編寫解析器?
語法可能是這樣的 -
使用分詞器,讓它將字符串分解為有意義的結構。
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.