大佬教程收集整理的这篇文章主要介绍了ocamllex 中的词法字符串,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在尝试找到一个很好的例子来处理 ocamllex 中的字符串时遇到了一些麻烦。我发现桌面计算器示例有点有用,但还没有真正找到以类似方式实现它的方法,它也使用字符串,这是我引用的示例:
{
open Parser (* The type token is defined in parser.mli *)
exception Eof
}
rule token = parse
[' ' '\t'] { token lexbuf } (* skip blanks *)
| ['\n' ] { Eol }
| ['0'-'9']+ as lxm { INT(int_of_String lxm) }
| '+' { PLUS }
| '-' { MINUS }
| '*' { TIMES }
| '/' { div }
| '(' { LPAREN }
| ')' { RPAREN }
| eof { raise Eof }
任何帮助将不胜感激。
我假设您正在谈论 OCaml 中的双引号字符串。词法字符串的难点在于它们需要某种转义机制来允许表示引号(通常还有转义机制本身)。
这里是 OCaml 词法分析器本身的字符串代码的简化版本:
let String_buff = Buffer.create 256
let char_for_BACkslash = function
| 'n' -> '\010'
| 'r' -> '\013'
| 'b' -> '\008'
| 't' -> '\009'
| c -> c
. . .
let BACkslash_escapes =
['\\' '\'' '"' 'n' 't' 'b' 'r' ' ']
. . .
rule main = parse
. . .
| '"'
{ Buffer.clear String_buff;
String lexbuf;
StriNG (Buffer.contents String_buff) }
. . .
and String = parse
| '"'
{ () }
| '\\' (BACkslash_escapes as C)
{ Buffer.add_char String_buff (char_for_BACkslash c);
String lexbuf }
| _ as c
{ Buffer.add_char String_buff c;
String lexbuf }
编辑:此代码的主要特点是它使用第二个扫描器(名为 String
)在带引号的字符串中进行词法分析。这通常比尝试为所有令牌编写单个扫描器更简洁——有些令牌非常复杂。类似的技术常用于扫描评论。
以上是大佬教程为你收集整理的ocamllex 中的词法字符串全部内容,希望文章能够帮你解决ocamllex 中的词法字符串所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。