ako*_*nsu 5 parsing token tokenize formal-languages
我正在为一种具有以下功能的语言进行解析器
标识符(例如,字母后跟多个字母数字字符或下划线),
整数(任意数量的数字和可能的脱字符号^),
一些操作员
文件名(一些字母数字字符,可能还有斜杠和点)
文件名显然与整数和标识符重叠,因此,除非文件名包含斜杠或点,否则通常无法确定我是否具有文件名或标识符。
但是文件名只能跟随特定的运算符。
我的问题是令牌化期间通常如何处理这种情况?我有一个表驱动的令牌生成器(词法分析器),但是我不确定如何从整数或标识符中分辨出文件名。怎么做?
如果filename是整数和标识符的超集,那么我可能可以使用可以处理该语法的语法,但是标记重叠...
Flex 和其他词法分析器具有启动条件的概念。本质上,词法分析器是一个状态机,其确切行为将取决于其当前状态。
在您的示例中,当您的词法分析器遇到文件名前面的运算符时,它应该切换到某种FilenameMode状态(或其他状态),然后在生成所需的文件名标记后切换回来。
编辑:
只是为了在超链接的这一侧提供一些具体代码:
FILENAME_MODE当你遇到接线员时你就会触发你...
{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }
Run Code Online (Sandbox Code Playgroud)
您可以定义解析文件名的规则:
<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }
Run Code Online (Sandbox Code Playgroud)
...切换回INITIAL动作中的状态。