我目前正在研究用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)
任何帮助都是有用的!
答案 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