ocamlex匹配行的开头?
我正在用OCaml和OCAMLEX编写一个玩具编程语言,并试图使该语言对缩进变化、python风格敏感,但在匹配行的开头和OCAMLEX的正则表达式规则时遇到了问题。我习惯于使用ocamlex匹配行的开头?,ocaml,ocamllex,Ocaml,Ocamllex,我正在用OCaml和OCAMLEX编写一个玩具编程语言,并试图使该语言对缩进变化、python风格敏感,但在匹配行的开头和OCAMLEX的正则表达式规则时遇到了问题。我习惯于使用^匹配行首,但在OCaml中,这是字符串concat运算符。不幸的是,谷歌搜索并没有给我带来太多的帮助:(有人知道这是怎么回事吗?我不确定是否有对零长度匹配符号的明确支持(比如Perl风格的正则表达式中的^,它匹配一个位置而不是一个子字符串).但是,您应该能够让您的lexer将换行符转换为显式标记,如下所示: parse
^
匹配行首,但在OCaml中,这是字符串concat运算符。不幸的是,谷歌搜索并没有给我带来太多的帮助:(有人知道这是怎么回事吗?我不确定是否有对零长度匹配符号的明确支持(比如Perl风格的正则表达式中的^
,它匹配一个位置而不是一个子字符串).但是,您应该能够让您的lexer将换行符转换为显式标记,如下所示:
parser.mly
%token EOL
%token <int> EOLWS
% other stuff here
%%
main:
EOL stmt { MyStmtDataType(0, $2) }
| EOLWS stmt { MyStmtDataType($1 - 1, $2) }
;
这是未经测试的,但总体思路是:
- 将换行代码视为“起点”
- 测量紧跟在换行符后面的空格,并将其长度作为
int
警告:如果不包含一个,您需要预处理您的输入,以从单个
\n
开始。正则表达式的语法可以在这里找到;是的,我看到了,我希望我只是缺少了一些东西,而且还有更多。谢谢!没问题。基于他们的说法,这肯定是一个自然的假设类似于Lex和通用正则表达式语言的知识。我不确定他们为什么不包括它;这可能是问fa.caml谷歌小组的问题。
{
open Parser
exception Eof
}
rule token = parse
[' ' '\t'] { token lexbuf } (* skip other blanks *)
| ['\n'][' ']+ as lxm { EOLWS(String.length(lxm)) }
| ['\n'] { EOL }
(* ... *)