我正在用 ocamllex 在 OCaml 中编写一种玩具编程语言,并试图使该语言对缩进变化敏感,python 风格,但是在将行的开头与 ocamllex 的正则表达式规则匹配时遇到问题。我习惯于^
匹配行首,但在 OCaml 中,它是字符串 concat 运算符。不幸的是,谷歌搜索对我来说并没有出现太多:(有人知道这会如何工作吗?
user35288
问问题
641 次
1 回答
4
我不确定是否明确支持零长度匹配符号(例如^
在 Perl 样式的正则表达式中,它匹配位置而不是子字符串)。但是,您应该能够让词法分析器将换行符转换为显式标记,如下所示:
解析器
%token EOL
%token <int> EOLWS
% other stuff here
%%
main:
EOL stmt { MyStmtDataType(0, $2) }
| EOLWS stmt { MyStmtDataType($1 - 1, $2) }
;
词法分析器
{
open Parser
exception Eof
}
rule token = parse
[' ' '\t'] { token lexbuf } (* skip other blanks *)
| ['\n'][' ']+ as lxm { EOLWS(String.length(lxm)) }
| ['\n'] { EOL }
(* ... *)
这是未经测试的,但总体思路是:
- 将换行符视为 staetment 'starters'
- 测量紧跟换行符的空格并将其长度作为
int
\n
警告:如果输入不包含一个,则需要预处理输入以从单个开始。
于 2011-03-15T17:00:40.960 回答