- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在基于 this BNF definition 在 happy 上制作一个简单的命题逻辑解析器命题逻辑语法,这是我的代码
{
module FNC where
import Data.Char
import System.IO
}
-- Parser name, token types and error function name:
--
%name parse Prop
%tokentype { Token }
%error { parseError }
-- Token list:
%token
var { TokenVar $$ } -- alphabetic identifier
or { TokenOr }
and { TokenAnd }
'¬' { TokenNot }
"=>" { TokenImp } -- Implication
"<=>" { TokenDImp } --double implication
'(' { TokenOB } --open bracket
')' { TokenCB } --closing bracket
'.' {TokenEnd}
%left "<=>"
%left "=>"
%left or
%left and
%left '¬'
%left '(' ')'
%%
--Grammar
Prop :: {Sentence}
Prop : Sentence '.' {$1}
Sentence :: {Sentence}
Sentence : AtomSent {Atom $1}
| CompSent {Comp $1}
AtomSent :: {AtomSent}
AtomSent : var { Variable $1 }
CompSent :: {CompSent}
CompSent : '(' Sentence ')' { Bracket $2 }
| Sentence Connective Sentence {Bin $2 $1 $3}
| '¬' Sentence {Not $2}
Connective :: {Connective}
Connective : and {And}
| or {Or}
| "=>" {Imp}
| "<=>" {DImp}
{
--Error function
parseError :: [Token] -> a
parseError _ = error ("parseError: Syntax analysis error.\n")
--Data types to represent the grammar
data Sentence
= Atom AtomSent
| Comp CompSent
deriving Show
data AtomSent = Variable String deriving Show
data CompSent
= Bin Connective Sentence Sentence
| Not Sentence
| Bracket Sentence
deriving Show
data Connective
= And
| Or
| Imp
| DImp
deriving Show
--Data types for the tokens
data Token
= TokenVar String
| TokenOr
| TokenAnd
| TokenNot
| TokenImp
| TokenDImp
| TokenOB
| TokenCB
| TokenEnd
deriving Show
--Lexer
lexer :: String -> [Token]
lexer [] = [] -- cadena vacia
lexer (c:cs) -- cadena es un caracter, c, seguido de caracteres, cs.
| isSpace c = lexer cs
| isAlpha c = lexVar (c:cs)
| isSymbol c = lexSym (c:cs)
| c== '(' = TokenOB : lexer cs
| c== ')' = TokenCB : lexer cs
| c== '¬' = TokenNot : lexer cs --solved
| c== '.' = [TokenEnd]
| otherwise = error "lexer: Token invalido"
lexVar cs =
case span isAlpha cs of
("or",rest) -> TokenOr : lexer rest
("and",rest) -> TokenAnd : lexer rest
(var,rest) -> TokenVar var : lexer rest
lexSym cs =
case span isSymbol cs of
("=>",rest) -> TokenImp : lexer rest
("<=>",rest) -> TokenDImp : lexer rest
}
现在,我有两个问题
任何帮助都会很棒。
最佳答案
如果您将 happy 与 -i
一起使用,它将生成一个信息文件。该文件列出了解析器具有的所有状态。它还将列出每个状态的所有可能的转换。您可以使用此信息来确定您是否关心移位/归约冲突。
有关调用 happy 和冲突的信息:
下面是 -i
的一些输出。我已删除除状态 17 之外的所有内容。您需要获取此文件的副本,以便可以正确调试问题。您在这里看到的只是为了帮助讨论一下:
-----------------------------------------------------------------------------
Info file generated by Happy Version 1.18.10 from FNC.y
-----------------------------------------------------------------------------
state 17 contains 4 shift/reduce conflicts.
-----------------------------------------------------------------------------
Grammar
-----------------------------------------------------------------------------
%start_parse -> Prop (0)
Prop -> Sentence '.' (1)
Sentence -> AtomSent (2)
Sentence -> CompSent (3)
AtomSent -> var (4)
CompSent -> '(' Sentence ')' (5)
CompSent -> Sentence Connective Sentence (6)
CompSent -> '¬' Sentence (7)
Connective -> and (8)
Connective -> or (9)
Connective -> "=>" (10)
Connective -> "<=>" (11)
-----------------------------------------------------------------------------
Terminals
-----------------------------------------------------------------------------
var { TokenVar $$ }
or { TokenOr }
and { TokenAnd }
'¬' { TokenNot }
"=>" { TokenImp }
"<=>" { TokenDImp }
'(' { TokenOB }
')' { TokenCB }
'.' { TokenEnd }
-----------------------------------------------------------------------------
Non-terminals
-----------------------------------------------------------------------------
%start_parse rule 0
Prop rule 1
Sentence rules 2, 3
AtomSent rule 4
CompSent rules 5, 6, 7
Connective rules 8, 9, 10, 11
-----------------------------------------------------------------------------
States
-----------------------------------------------------------------------------
State 17
CompSent -> Sentence . Connective Sentence (rule 6)
CompSent -> Sentence Connective Sentence . (rule 6)
or shift, and enter state 12
(reduce using rule 6)
and shift, and enter state 13
(reduce using rule 6)
"=>" shift, and enter state 14
(reduce using rule 6)
"<=>" shift, and enter state 15
(reduce using rule 6)
')' reduce using rule 6
'.' reduce using rule 6
Connective goto state 11
-----------------------------------------------------------------------------
Grammar Totals
-----------------------------------------------------------------------------
Number of rules: 12
Number of terminals: 9
Number of non-terminals: 6
Number of states: 19
该输出基本上表明它在查看连接词时遇到了一些歧义。事实证明,您链接的幻灯片提到了这一点(幻灯片 11),“通过优先级 Ø∧∨⇒⇔ 或括号解决了歧义”。
此时,我建议查看移位/归约冲突以及您所需的优先级,看看您拥有的解析器是否会做正确的事情。如果是这样,那么您可以安全地忽略这些警告。如果没有,您自己还有更多工作要做。
关于parsing - Happy 中命题逻辑解析器中的移位/减少冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135480/
The net closely but buckle not forever. 十指紧扣却扣不住天长地久。 Can your self-esteem and my stubborn reconci
Shout it from the sea. 来自深海的呼喊 I've been hdding their cry to helpless. 我曾抱着自己哭到无助 My happiness is
我正在尝试使用 x = 4 和 pritn x 实现一些语言,使用 haskell 构建快乐到目前为止,我已经定义了这样的语法 terms : term
我正在尝试使用 Happy(Haskell 工具)进行解析器,但收到一条消息错误:“未使用的规则:11 和未使用的终端:10”,我不知道这意味着什么。另一方面,我真的不确定规则语句中 $i 参数的使用
在 Haskell 中探索解析库我遇到了这个项目:haskell-parser-examples .运行一些示例,我发现运算符优先级存在问题。使用 Parsec 时效果很好: $ echo "3*2+
蛋糕不仅需要美味,外观也很重要。既好吃又好看的蛋糕才能够让人赏心悦目,送上一组好看的生日蛋糕图片给大家,希望你们会喜欢。
题目地址:https://leetcode.com/problems/happy-number/open in new window Total Accepted: 36352 Total Subm
我正在用 Happy 构建一个解析器,并注意到这是 online documentation : Like yacc, we include %% here, for no real reason.
我正在使用 happy.js 来验证表单。对于此表单,我需要用户提交五个可能的密码之一,如果用户未正确提交任何密码,则表单必须失败。 不知道我在这里做错了什么。感谢任何帮助。代码如下: 前面:
我正在基于 this BNF definition 在 happy 上制作一个简单的命题逻辑解析器命题逻辑语法,这是我的代码 { module FNC where import Data.Char i
我目前正在使用 happy 解析器生成器。 其他解析器生成器可以提供不错的消息,例如“意外的结束行,预期的‘然后’”。很高兴我只得到当前的 token 和错误的位置。 您能给我一个如何获取上述错误消息
我正在尝试安装 Fay。 Fay 依赖于 pretty-show,所以我正在安装它。当我运行 cabal install pretty-show 时,出现以下错误: Resolving depende
我的代码可以工作,但计数不正确。例如,它将 22 和 208 视为 happy numbers ,但他们不是。乘法结果也是错误的:42之后不是20,而是45 function isHappy(
我正在用 Happy 编写一个 JavaScript 解析器我需要匹配一个正则表达式。我不想完全解析正则表达式,只是将其存储为字符串。 我的 AST 的相关部分如下所示: data PrimaryEx
我正在尝试使用 Happy.js 在客户端验证表单。 基本验证工作正常,但我有一个稍微复杂的部分,我需要验证它有点复杂。本质上,有一个是/否单选框,如果是,则显示更多输入标签。仅当单选按钮为是时才需要
这里我有一个函数,它应该将一个数字 n 放入 disHappy(n) 以检查是否所有 [n-0) 中的 n 个很高兴。 Happy Numbers wikipedia 如果我只运行 happyChec
题目地址:https://leetcode-cn.com/problems/longest-happy-string/ 题目描述 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这
我正在为一种实验语言进行语义分析。我正在使用 Alex 和 Happy 来生成词法分析器和解析器(实际上我正在使用 BNFC 工具来生成 Alex 和 Happy 文件)。每当出现语义错误(例如类型错
我正在做一个学校项目,我必须在 Haskell 中使用 Alex + Happy 构建一个简单语言的解释器。 浏览完文档后,我了解了大部分内容,但希望看到有关使用这些工具的完整示例。 最佳答案 不是构
我有以下(大量精简的)快乐语法 %token '{' { Langle } '}' { Rangle } '..' { DotDot } '::' { ColonC
我是一名优秀的程序员,十分优秀!