球拍词法师贪婪的选择

Racket lexer greedy selection

提问人:IDANG 提问时间:5/16/2023 更新时间:5/17/2023 访问量:37

问:

我正在尝试用球拍编写词法分析器,我正在使用 parser-tools/lex 和 parser-tools/lex-sre。 我想为字符串创建令牌 - 但是因为词法分析器的选择并不贪婪,如果我有:

"this is" .... "cool" 

它将是一个令牌,而不是

StringToken ,Tokens....,StringToken . 

我怎样才能修复它并使其在选择中变得懒惰/贪婪? 到现在为止,我有:

       [
            (: 
            #\" 
            (repetition  
                0
                +inf.0
                (complement 
                (or
                    #\newline 
                    whitespace
                
                )

                ) 
            )   
            #\") 
            (begin (token-STRING  lexeme  ))
        ]

但它并没有像我说的那样很好地完成工作.

谢谢 Idan.M 。

编译器-构造 球拍 lexer nand2tetris

评论


答:

0赞 IDANG 5/16/2023 #1

我找到了一个小技巧来完成这项工作 - 我不太喜欢它(因为它有点限制了语言) - 但直到有人回答更好的东西:

[
    (: 
    #\" 

    (repetition  
        0
        +inf.0
        (~ 
            #\"
        ) 
    )    
    #\") 
    (begin (token-STRING (substring lexeme 1 (sub1 (string-length lexeme)) )))
]
0赞 Sorawee Porncharoenwase 5/17/2023 #2

该软件包具有 from/to,它精确地执行您想要的操作:非贪婪匹配 from to .bragfromto

因此,要么安装并使用此软件包,要么查看源代码以了解其工作原理。AFAICS,他们的解决方案看起来也有点骇人听闻(与你的相当),但它是封装的,因此当你定义抽象时,你只需要做一次这个骇人听闻的位。