我正在爲Wolfram語言編寫解析器。該語言具有「命名字符」的概念,該命名由由\[
和]
定界的名稱來指定。例如:\[Pi]
。antlr4:需要將符號序列轉換爲詞法分析器中的字符
假設我想爲一個標識符指定一個正則表達式。標識符可以包含命名字符。我看到了兩種方法:一種是預處理器將所有命名字符轉換爲unicode表示形式,另一種是枚舉所有可能的命名字符作爲正則表達式的一部分。
第二種方法似乎不可行,因爲有很多命名字符。我寧願在我的正則表達式中有unicode字符的範圍。
所以我想預處理我的令牌流。換句話說,在我看來,詞法分析器需要檢查命名字符語法是否正確,然後查找名稱並將其轉換爲unicode。
但是,如果語法不正確或名稱不存在,我需要告訴用戶它。如何將這個錯誤傳播給用戶,然後讓antlr4從錯誤中恢復並恢復?也許我可以排序「管道」詞法分析器/解析器? (我是antlr的新手)。
編輯:
在Wolfram語言我可以具有這個字符串作爲標識符:\[Pi]Squared
。括號內的部分稱爲「命名字符」。有一組有限的命名字符,每個命名字符對應一個unicode碼點。我想弄清楚如何標記這樣的標識符。
我可以有我的令牌像這樣(簡化爲一個名爲字符和ASCII字符的組合)的規則:
NAME : ('\\[' [a-z]+ ']'|[a-zA-Z])+ ;
,但我想,以檢查是否已命名的字符確實存在(和其他屬性,如它是否是一個字母,但後一部分不在問題範圍內),所以這個正則表達式不起作用。
我考慮製作一個允許的命名字符的列表,並且只是列舉一個很長的正則表達式,但這看起來很難看。
這將是一個很好的方法嗎?編輯
謝謝。你的意思是爲標識符標記使用'ID =([a-z] | NChar)+',並在構建分析樹之後檢查指定字符的值? – akonsu
答覆已更新。 – GRosenberg
謝謝。我還沒有看到它會如何幫助我製作符合標識符部分的解析器製作。這隻有在我不跳過空格時纔有效,對吧?也許我完全困惑... – akonsu