区分 Julia 词法分析器中的转置和命令字符串

Distinguish between transpose and command string in Julia lexer

为了我的论文,我正在为 Julia 实现一个 parser/lexer,但是有些地方有点问题。

对于背景,Julia 有一个特殊的标记来提供转置 (`),还有 'command string' 使用这个相同的标记来包装字符串 (`command`)。我遇到的问题是我似乎无法获得能够正确匹配的正则表达式。

即 这应该匹配转置:

a`

以及

a` b`

a`
b`

这应该匹配命令字符串

`a` 还有:

` a
b `

我遇到的问题是,当文件中有 2 个转置时它将匹配命令字符串,或者当命令字符串中有新行时解析器将失败,因为两者都被视为仅一个转置,对我来说这似乎是相互排斥的。

正则表达式在词法分析器中的顺序是:

选项 1:

COMMAND
    : '`' (ESC|.)*? '`'
    ;
 TRANSPOSE
    : '\'' | '`'
    ;

选项 2:

COMMAND
    : '`' ( '\' | ~[\\r\n\f] )* '`'
    ;
 TRANSPOSE
    : '\'' | '`'
    ;

如评论中所述,Julia 中的转置运算符实际上是 ',而不是 `。尚未注意到的是 ' 的使用方式与 ` 的使用方式之间至少存在一个关键差异),这使您的工作变得容易得多。具体来说:

  • ` 不同,后者可用于引用 任意 长度的命令字符串,' 仅用于引用字符。因此,' 作为引号的唯一有效用法是单个字符(例如 `a`)或以 \ 开头的特殊 ANSI 转义序列之一,例如 `\n`换行符(据我所知,完整列表 \a\b\f\n\r\t\v , \`, \", 和 \).

因此,像 [a' b'] 这样的序列中的 ' 只能解释为转置,因为 ' b' 不是有效的 Char

  • 虽然并列在 Julia 中可以理解为乘法,而乘法又可以用来在 Julia 中连接字符串(长话短说——字符串连接是 free monoid 和因此类似于乘法),目前不允许并列作为乘法字符串或字符的一种方式。

因此,像 a'b' 这样的序列只能解释为 a' * b' 而不是 a * 'b'

将这两者更广泛地结合起来,除非我遗漏了一些边缘情况,否则新的 ' 似乎跟在 之后的任何字符 除了 空格、括号或有效 infix operator,总是被解析为转置,而不是字符文字的开头引号。