Haskell中的Lexer - 如何模式匹配特定案例?

时间:2015-10-10 18:01:52

标签: html haskell design-patterns token matching

我目前正在研究用Haskell编写的词法分析器,并且差不多完成了,但是我遇到了一个特殊情况令牌的问题。目前,我的词法分析器采用输入字符串并将语句分解为数字,变量名称和特定标记(如“if”,“else”和“then”)的标记。

它对我的所有令牌都很有用,除了一个“000 ......”。

我被教导使用span函数,所以我让我的词法分析器使用isDigit和isAlphaNum布尔函数来解析输入。但是,因为“000 ...”以零开头,它会自动返回一个数字。另外,句点也是语法中的标记,因此在我的词法分析器中输入“000 ...”的结果当前导致“0”“。” “” “”。

我不熟练使用Haskell的语言,但是是否可以使用isPrint匹配字符串,并使用用例来处理字符串和整数的实例?我现在感到茫然,似乎我所尝试的一切都打破了我的计划。我目前的模式匹配部分如下所示:

lexer (c:cs)
| isSpace c = lexer cs
| isDigit c = lexDigit (c:cs)
| isAlphaNum c = lexString (c:cs)
| True = InvalidToken c : lexer cs

lexString 
| s1 == "if" = IfToken : lexer s2 
| s1 == "else" = ElseToken : lexer s2 
| s1 == "then" = ThenToken : lexer s2 
| s1 == "000..." = Zero : lexer s2
| True = StringToken s1 : lexer s2 
where (s1,s2) = (span isAlphaNum cs)

任何帮助都是有用的!

1 个答案:

答案 0 :(得分:0)

首先请注意,在Haskell中处理此类任务的惯用方法是使用解析器组合库,例如parsec(对于某些应用程序来说,传统的解析器/词法分析器路线可能是有意义的,但这不是你应该手动编码的东西 - 使用词法分析器生成器,即{{ 3}}。)

现在,如果您决定手动执行此操作,并且没有更具表现力的解析器组合器......您需要在<!DOCTYPE html> <!--gemaakt door Timo Vossen D01--> <html> <head> <title>Home</title> <meta name="keywords" content=""/> <meta name="author" content="Timo Vossen"/> <meta name="description" content=""/> <meta charset="UTF-8"/> <link rel="stylesheet" href="home.css" /> <link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'> </head> <body> <div id="menu"> <img src="img/logo.png" alt="aston martin logo" class="logo"/> <img src="img/logo2.png" alt="vanquish logo" class="logo"/> </div> <div id="header"> <div id="pijl"> <a id="knop" href="#over"><img src="img/pijl.png" alt="pijl" id="pijlfoto"/></a> </div> </div> <div id="over"> </div> <div id="specs"> <div class="laag"> </div> </div> <div id="peformance"> </div> <div id="slider"> <div class="laag"> </div> </div> <div id="footer"> </div> </body> </html> 中处理该特殊情况,而不是lexDigit:< / p>

lexString