区分 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,总是被解析为转置,而不是字符文字的开头引号。
为了我的论文,我正在为 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,总是被解析为转置,而不是字符文字的开头引号。