我正在研究一种语言的解析器
>标识符(例如,一个字母后跟一些字母数字字符或下划线),
>整数(任意数字和可能的插入^),
>一些操作符,
> filename(一些字母数字字符,可能还有斜线和点)
显然文件名重叠整数和标识符,所以一般情况下我无法确定我是否有文件名,或者说是标识符,除非文件名包含斜杠或点.
但文件名只能跟随特定的运算符.
我的问题是在标记化过程中通常如何处理这种情况?我有一个表驱动的标记器(词法分析器),但我不知道如何从整数或标识符告诉文件名.这是怎么做到的?
如果filename是整数和标识符的超集,那么我可能会有语法产生来处理它,但令牌重叠……
最佳答案 Flex和其他词法分析器具有
start conditions的概念.本质上词法分析器是状态机,其确切行为将取决于其当前状态.
在您的示例中,当您的词法分析器在文件名之前遇到操作符时,它应该切换到FilenameMode状态(或其他),然后在它生成它期望的文件名标记后切换回来.
编辑:
只是在超链接的这一边给出一些具体的代码:
遇到运算符时会触发FILENAME_MODE …
{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }
您将定义您的规则来解析文件名:
<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }
…在动作中切换回INITIAL状态.