强制CL-Lex阅读整个单词

Flá*_*ruz 4 lisp lexer

我正在使用CL-Lex实现词法分析器(作为CL-YACC的输入),我的语言有几个关键词,如"let"和"in".然而,虽然词法分析器识别出这样的关键词,但它确实太多了.当它找到诸如"init"之类的单词时,它将第一个标记返回为IN,而它应该为"init"字返回一个"CONST"标记.

这是词法分析器的简单版本:

(define-string-lexer lexer
     (...)
     ("in"   (return (values :in $@)))
     ("[a-z]([a-z]|[A-Z]|\_)"  (return (values :const $@))))
Run Code Online (Sandbox Code Playgroud)

如何强制词法分析器完全读取整个单词,直到出现一些空格?

小智 8

这既是对Kaz的错误的纠正,也是对OP的信任投票.

在他最初的回应中,Kaz说完Unix lex优先顺序完全落后.从lex文档:

Lex可以处理模糊的规范.当多个表达式与当前输入匹配时,Lex选择如下:

  1. 最长的比赛是首选.

  2. 在匹配相同数量的字符的规则中,首先给出的规则是优选的.

另外,Kaz批评OP使用Perl-regex字边界匹配的解决方案是错误的.碰巧的是,你被允许(没有折磨内疚)来匹配词法生成器支持的任何方式的单词.CL-LEX使用Perl正则表达式,它\b使用方便的语法来处理更加繁琐的lex近似:

%{
#include <stdio.h>
%}

WC      [A-Za-z']
NW      [^A-Za-z']

%start      INW NIW

{WC}  { BEGIN INW; REJECT; }
{NW}  { BEGIN NIW; REJECT; }

<INW>a { printf("'a' in wordn"); }
<NIW>a { printf("'a' not in wordn"); }
Run Code Online (Sandbox Code Playgroud)

在所有条件相同的情况下,找到一种明确匹配他的话的方法可能比替代方案更好.

尽管Kaz想要打他,但是OP已经正确地回答了他自己的问题,提出了一个利用他选择的词法分析器灵活性的解决方案.