在使用Alex lexer生成器或Happy解析器生成器创建一个Lexer.x或一个Parser.y解析器时,将它们编译成Haskell文件,并将它们编译成目标文件,默认情况下会产生以下"警告":
$ ghc Lexer
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[1 of 1] Compiling Lexer ( Lexer.hs, Lexer.o )
$ happy Parser.y
$ ghc Parser
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[2 of 2] Compiling Parser ( Parser.hs, Parser.o )
Run Code Online (Sandbox Code Playgroud)
这些行是由于生成的.hs文件中嵌入了以下行而产生的:
{-# LINE 1 "<command-line>" #-}
Run Code Online (Sandbox Code Playgroud)
为什么包含这些行,并且有一种方法可以抑制这些消息,以防命令行显然没有用于生成的词法分析器和解析器中的任何内容?
我有一个语法,根据作品的顺序,快乐的报告3减少/减少冲突或没有.我能找到的最小例子是:
%tokentype {Token}
%token
int { Int }
'-' { Neg }
both { Both }
%nonassoc both
%left '-'
%nonassoc NEG
%%
E : int {IntE}
| both E E {BothE $2 $3}
| '-' E %prec NEG {NegE $2}
| E '-' E {SubE $1 $3}
{
data Token = Int | Neg | Both deriving Show
data Expr = BothE Expr Expr | IntE | SubE Expr Expr | NegE Expr deriving Show
}
Run Code Online (Sandbox Code Playgroud)
这有3个减少 - 减少冲突,基于无法区分" …
我正在使用happyJS并使用下面的正则表达式进行电话验证
phone: function (val) {
return /^(?:[0-9]+$)/.test(val);
}
Run Code Online (Sandbox Code Playgroud)
然而,这仅允许数字.我希望用户能够输入空格
238 238 45383
Run Code Online (Sandbox Code Playgroud)
知道为什么return /^(?:[0-9 ]+$)/.test(val);不做这个伎俩?
我在这里有两个Happy代码片段,一个使用普通优先级规则,另一个使用依赖于上下文的优先级规则(这两个都在这里描述).
正常:
%left '+'
%left '*'
%%
Exp :: { Exp }
: Exp '+' Exp { Plus $1 $3 }
| Exp '*' Exp { Times $1 $3 }
| var { Var $1 }
Run Code Online (Sandbox Code Playgroud)
上下文相关的:
%left PLUS
%left TIMES
%%
Exp :: { Exp }
: Exp '+' Exp %prec PLUS { Plus $1 $3 }
| Exp '*' Exp %prec TIMES { Times $1 $3 }
| var { Var $1 }
Run Code Online (Sandbox Code Playgroud)
鉴于输入:
a * …Run Code Online (Sandbox Code Playgroud) 所以我试图为单行语句实现一个非常简单的语法:
# Grammar
c : Character c [a-z0-9-]
(v) : Vowel (= [a,e,u,i,o])
(c) : Consonant
(?) : Any character (incl. number)
(l) : Any alpha char (= [a-z])
(n) : Any integer (= [0-9])
(c1-c2) : Range from char c1 to char c2
(c1,c2,c3) : List including chars c1, c2 and c3
Examples:
h(v)(c)no(l)(l)jj-k(n)
h(v)(c)no(l)(l)(a)(a)(n)
h(e-g)allo
h(e,f,g)allo
h(x,y,z)uul
h(x,y,z)(x,y,z)(x,y,z)(x,y,z)uul
Run Code Online (Sandbox Code Playgroud)
我正在使用Happy parser生成器(http://www.haskell.org/happy/),但由于某种原因,似乎存在一些歧义问题.
错误消息是:"shift/reduce conflicts:1"
我认为模棱两可是这两行:
| lBracket char rBracket { (\c -> case c of
'v' -> TVowel
'c' -> …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,该项目涉及在一小部分Java中优化某些构造,在BNF中形式化.
如果我在Java中这样做,我会使用JTB和JavaCC的组合来构建AST.然后访客用于操纵树.但是,考虑到在Haskell中解析庞大的库(parsec,happy,alex等),我在选择合适的库时有点困惑.
那么,简单地说,当在BNF中指定一种语言时,哪个库提供了构建AST的最简单方法?在惯用的Haskell中修改这棵树的最佳方法是什么?
我一直试图让快乐正确安装,在过去几天,虽然我发现它具有挑战性的获得cabal install happy不只是错误(通过安装happy-1.19与apt-get并添加/opt/happy/1.19.3/bin到PATH),现在它通过源运行,直到它到达ProduceCode(15/18)并且似乎进入无限循环.Ctrl+C当整个系统无响应时,它会累积内存,直到我点击或关闭电源.
我想我记得这根本不是GHC-HEAD的问题,但我不想使用头部,因为它似乎每隔几天更新一次,要求我不断重建我的包裹,除非有一个技巧我不要不知道从哪里迁移head到head+1.
$ ghc -v
Glasgow Haskell Compiler, Version 7.8.2, stage 2 booted by GHC version 7.4.1
Using binary package database: /opt/ghc/7.8.2/lib/ghc-7.8.2/package.conf.d/package.cache
Using binary package database: /home/house/.ghc/x86_64-linux-7.8.2/package.conf.d/package.cache
package oeis-0.3.5-26e4c8a4e89d20dbd9e2d89ad4774bd0 is unusable due to missing or recursive dependencies:
HTTP-4000.2.12-2793df5d0fb675f1a42bc04cfdf74851
hiding package Cabal-1.18.1.3 to avoid conflict with later version Cabal-1.20.0
hiding package Cabal-1.19.2 to avoid conflict with later version Cabal-1.20.0
wired-in package …Run Code Online (Sandbox Code Playgroud) 我遇到了由 Happy 生成的看似无效的代码。问题归结为 GHC 没有推断函数的多类类型签名。下面是一个例子:
\n\n{-# Language MagicHash #-}\n\nf x = ()\n\nmain = pure (f 1#)\nRun Code Online (Sandbox Code Playgroud)\n\n由于 GHC 正在推断f :: a -> ()哪里a :: *,所以失败了
\xe2\x80\xa2 Couldn't match a lifted type with an unlifted type\n When matching the kind of \xe2\x80\x98GHC.Prim.Int#\xe2\x80\x99\n \xe2\x80\xa2 In the first argument of \xe2\x80\x98f\xe2\x80\x99, namely \xe2\x80\x981#\xe2\x80\x99\n In the first argument of \xe2\x80\x98pure\xe2\x80\x99, namely \xe2\x80\x98(f 1#)\xe2\x80\x99\n In the expression: pure (f 1#)\nRun Code Online (Sandbox Code Playgroud)\n\n是否有任何语言编译指示我可以打开来编译此代码?我知道理论上我可以只添加类型签名,但是,由于这是由 Happy 生成的代码,我不希望手动修改任何内容。
\n我正在开发一个使用Happy parser生成器的项目.这是我到目前为止所做的事情:
Exp : Exp1 { $1 }
Exp1 : Exp1 '+' Term { \p -> $1 p + $3 p }
| Exp1 '-' Term { \p -> $1 p - $3 p }
| Term { $1 }
Term : Term '*' Factor { \p -> $1 p * $3 p }
| Term '/' Factor { \p -> $1 p / $3 p }
| sqrt Factor { \p -> sqrt $2 p }
| Factor { …Run Code Online (Sandbox Code Playgroud)