在使用fslex和fsyacc时,是否有一种简单的方法可以让lexing和解析同时运行?
在阅读了一个2年历史的网页后,真的扯掉fslex/fsyacc,越野车,慢,愚蠢等等与他们的OCamel同行相比,我想知道什么是最好的选择lexing解析需求?
我之前使用过ANTLR和C#绑定,但我目前正在学习F#,当我看到它带有解析器生成器时很兴奋.由于F#现在正式发布,似乎微软真的希望支持和发展.你会说fslex和fsyacc对于生产代码是否值得?
我正在学习F#,因为我想写一个词法分析器和解析器.我对这种处理有一点经验,但确实需要正确地学习它和F#.
在学习F#的lexing/parsing功能时,学习lex和yacc是否足够?
或者是否存在一些差异,这意味着lex/yacc的代码将无法与fslex和fsyacc一起使用?
类型不匹配.期待
LexBuffer<char>但是给定aLexBuffer<byte>类型'char'与'byte'类型不匹配
这是我在使用fslex时收到的错误消息.我试过手动检查每次出现的lexbuf及其类型.它是LexBuffer<char>无处不在.但编译器仍然给我上述错误.你能否告诉我为什么会出现这种错误以及如何解决它.
{
open System
open Microsoft.FSharp.Text.Lexing
open Microsoft.FSharp.Text.Parsing
let lexeme (lexbuf : LexBuffer<char>) = new System.String(lexbuf.Lexeme)
let newline (lexbuf:LexBuffer<char>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine
let unexpected_char (lexbuf:LexBuffer<char>) = failwith ("Unexpected character '"+(lexeme lexbuf)+"'")
}
let char = ['a'-'z' 'A'-'Z']
let digit = ['0'-'9']
let float = '-'?digit+ '.' digit+
let ident = char+ (char | digit)*
let whitespace = [' ' '\t']
let newline = ('\n' | '\r' '\n')
rule tokenize = parse
| …Run Code Online (Sandbox Code Playgroud) 我在业余时间一直在研究Lua fslex lexer,使用ocamllex手册作为参考.
我试图正确地标记长字符串时遇到了一些障碍."长串"由'[' ('=')* '['和']' ('=')* ']'令牌分隔; =标志的数量必须相同.
在第一个实现中,词法分析器似乎无法识别[[模式,LBRACKET尽管匹配规则最长,但产生两个令牌,而[=[正确识别的变量则产生两个令牌.此外,正则表达式无法确保使用正确的结束标记']' ('=')* ']',无论实际的长字符串"级别"如何,都会在第一次捕获时停止.此外,fslex似乎不支持正则表达式中的"as"结构.
let lualongstring = '[' ('=')* '[' ( escapeseq | [^ '\\' '[' ] )* ']' ('=')* ']'
(* ... *)
| lualongstring { (* ... *) }
| '[' { LBRACKET }
| ']' { RBRACKET }
(* ... *)
我一直试图用词法分析器中的另一个规则来解决这个问题:
rule tokenize = parse
(* ... *)
| '[' ('=')* '[' { longstring (getLongStringLevel(lexeme …Run Code Online (Sandbox Code Playgroud) 我已经使用C/lex很长时间了,现在想使用F#/ fslex.我在C#和学习F#的过程中相对富裕.唯一的事情是我看不到任何项目示例或模板,其中fslex正确包含在Visual Studio构建过程中.有谁知道我在哪里找到一个?
很多问候!沃尔克
我试图捕获没有引号的引用字符串.我有这个终端
%token <string> STRING
Run Code Online (Sandbox Code Playgroud)
而这个生产
constant:
| QUOTE STRING QUOTE { String($2) }
Run Code Online (Sandbox Code Playgroud)
以及这些词法规则
| '\'' { QUOTE }
| [^ '\'']* { STRING (lexeme lexbuf) } //final regex before eof
Run Code Online (Sandbox Code Playgroud)
它似乎正在解释导致QUOTE单个词汇的所有内容,而不是解析.所以也许我的问题在语法的其他地方 - 不确定.我是以正确的方式来做这件事的吗?在我尝试从字符串中排除引号之前,它解析得很好.
我认为以下词法分析器规则可能存在一些含糊之处
let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*
Run Code Online (Sandbox Code Playgroud)
之前的规则如下 STRING
| identifier { ID (lexeme lexbuf) }
Run Code Online (Sandbox Code Playgroud)
有没有办法消除这些歧义,而不包括STRING正则表达式中的引号?
我正在尝试使用fslex和编写一个小型 DSL 解析器fsyacc。输入由需要不同词法规则的两种不同语言的交错块组成。我如何编写我的fslex文件来支持它?
(我想类似的情况是如何fslex为 c 语言定义文件但支持内联汇编,这需要不同的词法分析规则?)
我目前拥有的是这样的:
rule tokenize = parse
| "core" { core lexbuf }
...
and core = parse
| ...
Run Code Online (Sandbox Code Playgroud)
问题是,一旦core解析器返回一个令牌,输入的下一部分就会被传递给tokenize。但是,我想(原样)留在该core州。我怎么做?
谢谢!