【发布时间】:2015-07-18 23:20:29
【问题描述】:
我正在为 Wolfram 语言编写解析器。该语言具有“命名字符”的概念,由\[ 和] 分隔的名称指定。例如:\[Pi]。
假设我想为一个标识符指定一个正则表达式。标识符可以包括命名字符。我看到了两种方法:一种是使用预处理器将所有命名字符转换为它们的 unicode 表示,另一种是枚举所有可能的命名字符,作为正则表达式的一部分。
第二种方法似乎不可行,因为有很多命名字符。我希望在我的正则表达式中有一系列 unicode 字符。
所以我想预处理我的令牌流。换句话说,在我看来,词法分析器需要检查命名字符的语法是否正确,然后查找名称并将其转换为 unicode。
但如果语法不正确或名称不存在,我需要告诉用户。如何将此错误传播给用户,但让 antlr4 从错误中恢复并恢复?也许我可以使用“管道”词法分析器/解析器? (我是 antlr 的新手)。
编辑:
在 Wolfram 语言中,我可以将此字符串作为标识符:\[Pi]Squared。括号之间的部分称为“命名字符”。有一组有限的命名字符,每个字符对应一个 unicode 代码点。我正在尝试弄清楚如何标记这样的标识符。
我可以为我的令牌设置这样的规则(简化为命名字符和 ASCII 字符的组合):
NAME : ('\\[' [a-z]+ ']'|[a-zA-Z])+ ;
但我想检查命名字符是否确实存在(以及其他属性,例如它是否是字母,但后半部分超出了问题的范围),所以这个正则表达式不起作用。
我考虑过制作一个允许的命名字符列表,然后只制作一个枚举所有这些字符的长正则表达式,但这看起来很难看。
什么是解决这个问题的好方法?
编辑结束
【问题讨论】: