标签: fslex

在F#中同时进行Lexing和解析

在使用fslex和fsyacc时,是否有一种简单的方法可以让lexing和解析同时运行?

f# parsing fsyacc fslex

37
推荐指数
1
解决办法
1244
查看次数

F#fslex fsyacc是否适合生产代码?

在阅读了一个2年历史的网页后,真的扯掉fslex/fsyacc,越野车,慢,愚蠢等等与他们的OCamel同行相比,我想知道什么是最好的选择lexing解析需求?

我之前使用过ANTLR和C#绑定,但我目前正在学习F#,当我看到它带有解析器生成器时很兴奋.由于F#现在正式发布,似乎微软真的希望支持和​​发展.你会说fslex和fsyacc对于生产代码是否值得?

f# fsyacc maturity fslex

9
推荐指数
3
解决办法
2562
查看次数

lex/yacc和fslex/fsyacc有什么区别?

我正在学习F#,因为我想写一个词法分析器和解析器.我对这种处理有一点经验,但确实需要正确地学习它和F#.

在学习F#的lexing/parsing功能时,学习lex和yacc是否足够?

或者是否存在一些差异,这意味着lex/yacc的代码将无法与fslex和fsyacc一起使用?

f# yacc lex fsyacc fslex

8
推荐指数
2
解决办法
2286
查看次数

期待LexBuffer <char>但是给出了一个LexBuffer <byte>类型'char'与'byte'类型不匹配

类型不匹配.期待 LexBuffer<char> 但是给定a LexBuffer<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)

f# fslex

6
推荐指数
2
解决办法
891
查看次数

Lua在fslex中长串

我在业余时间一直在研究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)

lua f# fslex ocamllex

6
推荐指数
1
解决办法
507
查看次数

FSLex示例解决方案?

我已经使用C/lex很长时间了,现在想使用F#/ fslex.我在C#和学习F#的过程中相对富裕.唯一的事情是我看不到任何项目示例或模板,其中fslex正确包含在Visual Studio构建过程中.有谁知道我在哪里找到一个?

很多问候!沃尔克

f# visual-studio fslex

5
推荐指数
2
解决办法
1812
查看次数

如何捕获没有引号字符的字符串

我试图捕获没有引号的引用字符串.我有这个终端

%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正则表达式中的引号?

f# parsing lexical-analysis fsyacc fslex

4
推荐指数
1
解决办法
1014
查看次数

fslex - 如何在两个令牌集之间切换?

我正在尝试使用fslex和编写一个小型 DSL 解析器fsyacc。输入由需要不同词法规则的两种不同语言的交错块组成。我如何编写我的fslex文件来支持它?

(我想类似的情况是如何fslex为 c 语言定义文件但支持内联汇编,这需要不同的词法分析规则?)

我目前拥有的是这样的:

rule tokenize = parse
    | "core"        { core lexbuf }
    ...

and core = parse
    | ...
Run Code Online (Sandbox Code Playgroud)

问题是,一旦core解析器返回一个令牌,输入的下一部分就会被传递给tokenize。但是,我想(原样)在该core州。我怎么做?

谢谢!

f# fslex

4
推荐指数
1
解决办法
98
查看次数

标签 统计

f# ×8

fslex ×8

fsyacc ×4

parsing ×2

lex ×1

lexical-analysis ×1

lua ×1

maturity ×1

ocamllex ×1

visual-studio ×1

yacc ×1