簡體   English   中英

語法/邏輯檢查器在Javascript中?

[英]Syntax / Logical checker In Javascript?

我正在為客戶端構建一個解決方案,允許他們創建非常基本的代碼,現在我已經完成了一些基本的語法驗證,但我堅持進行變量驗證。

我知道JSLint使用Javascript做到這一點,我想知道是否有人知道這樣做的好方法。

例如,假設用戶編寫了代碼

moose = "barry"
base = 0
if(moose == "barry"){base += 100}

然后我試圖找到一種方法來澄清“if”表達式是否正確的語法,如果變量moose已經初始化等等但我想這樣做而不逐個字符掃描,代碼是一個迷你語言專為此應用程序構建,因此非常非常基本,不需要管理內存或類似的東西。

我曾想過先通過Carriage Return然后再通過Space進行拆分,但沒有什么可說的,用戶不會寫像moose="barry"或者if(moose=="barry")並且沒有什么可說的用戶不會保持條件內聯的結果。

很明顯,編譯器和口譯員在更廣泛的范圍內這樣做,但我不確定他們是否確實按性別進行了操作,如果他們確實如何優化呢?

(其他選項是我可以將它發送回PHP進行處理,然后重新啟動瀏覽器的責任)

有什么建議?

謝謝

用例是有限的,在這種情況下語法永遠不會擴展,語言是一種簡單的腳本語言,使客戶能夠根據用戶輸入創建唯一的成本,最終結果將由PHP處理,無論如何都要保證計算最終用戶無法調整並確保一致性。

例如,假設基本成本為1.00英鎊,並且表單上有一個名為“附加成本”的字段,該語言將允許他們操縱相對於“額外成本”字段的基本成本。

所以

base = 1;
if(additional > 100 && additional < 150){base += 50}
elseif(additional == 150){base *= 150}
else{base += additional;}

這是如何使用該語言的基本示例。


感謝您的所有答案,我已經研究過一個解析器並且創建一個解析器比使用1000行代碼運行多個測試要復雜得多,並且發現逐個字符只需要幾秒鍾即可處理具有512mb內存的單核P4(遠遠低於客戶使用的內存)

我決定構建一個基於PHP的語法檢查器,它將檢查信息並將變量等轉換為有效的PHP代碼,同時它正在檢查它(以便以后可以調用它而無需重新編譯)使用此代替javascript這似乎更合適並且可以在不妨礙驗證過程的情況下產生更復雜的代碼

它只花了一個小時,我有能夠檢查if語句的有效性的代碼,並且不會被嵌套的if,space或奇怪的表達式混淆,只有很少的東西需要檢查,而解析器和完整的腳本語言會花更長的時間

你們都給了我很多思考,並且我已經給出了相關答案,謝謝

如果你真的想這樣做 - 我的意思是,如果你真的希望你的軟件能夠正常和可預測地工作,沒有一堆奇怪的“不要做這個”特殊情況 - 你將不得不寫一個真實的解析器為您的語言。 完成后,您可以將語言中的任何程序轉換為數據結構。 使用該數據結構,您將能夠對代碼進行各種分析,包括至少曾被稱為使用定義和定義使用鏈分析的過程。

如果您編寫了一個“編程語言”,可以在應用程序中啟用某些腳本,那么無論您認為它是多么微不足道,最終都會有人編寫一個令人震驚的大型程序。

我不知道任何可用的生成JavaScript解析器的解析器生成器。 遞歸下降解析器並不難寫,但是它們可能難以維護,並且它們使得擴展語法變得有點困難(特別是如果你沒有經驗豐富的原始版本)。

您可能希望查看JS / CC ,它是一個解析器生成器,可以在Javascript中為語法生成解析器。 您需要弄清楚如何使用BNF和EBNF描述您的語言。 此外,JS / CC有自己的語法(有點接近實際的BNF / EBNF)來指定語法。 給定語法,JS / CC將為該語法生成​​解析器。

正如Pointy所說,你的另一個選擇是從頭開始編寫自己的詞法分析器和遞歸下降解析器。 一旦你有了BNF / EBNF,就不那么難了。 我最近在Javascript中用EBNF編寫了一個解析器(語法非常簡單,因此編寫一個YMMV並不難)。

解決您對“客戶特定”的評論。 我還將在這里添加自己的經驗。 如果您提供腳本語言和腳本環境,那么沒有比實際解析器更好的路由。

通過一堆if-elses處理特殊情況將是非常痛苦和維護的噩夢。 當我還是大學新生時,我試着寫自己的語言。 這是在我對遞歸下降解析器或一般解析器一無所知之前。 我自己想通了代碼可以分解成代幣。 從那里開始,我使用一堆if-elses編寫了一個非常笨拙的解析器,並且還用空格和其他字符(正如你所描述的那樣)分割了令牌。 最終結果很可怕。

一旦我閱讀了遞歸下降解析器,我就為我的語言編寫了一個語法,並且在我編寫原始解析器的第10次創建解析器時很容易。 說真的,如果你想節省很多痛苦,那就寫一個真正的解析器吧。 如果你走下目前的路線,你將永遠解決問題。 您將不得不處理人們將空間放在錯誤位置的情況,或者他們可能有太多(或太少)空間。 唯一的另一種選擇是提供一個極其嚴格的結構(即,你必須在這個語句之后有正好 x個空格),這可能會使你的腳本環境極其缺乏吸引力。 實際的解析器將自動修復所有這些問題。

Javascript有一個'eval'函數。

var code = 'alert(1);';
eval(code);

它會顯示警報。 您可以使用'eval'來執行基本代碼。

暫無
暫無

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

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