flex-lexer - 需要 Lex 正则表达式来匹配字符串到换行符
问题描述
我想解析类型的字符串:
a=some value
b=some other value
'=' 周围没有空格,并且值扩展到换行符。可能有前导空格。
我的 lex 规范(相关部分)是:
%%
a= { printf("Found attr %s\n", yytext); return aATTR; }
^[ \r\t]+ { printf("Found space at the start %s\n", yytext); }
([^a-z]=).*$ { printf("Found value %s\n", yytext); }
\n { return NEWLINE; }
%%
我尝试.*$ [^\n]*
了其他一些正则表达式,但无济于事。这看起来很简单。有什么建议么?我也知道 lex 会返回最长的匹配项,从而使其更加复杂。我得到了与我尝试过的一些正则表达式匹配的整行。
解决方案
您可能想要合并单独的开始状态。这些允许您对简单的上下文进行编码。下面的简单示例在每次调用 yylex() 时捕获您的 id、运算符和值。
%{
char id;
char op;
char *value;
%}
%x VAL OP
%%
<INITIAL>[a-z]+ {
id = yytext[0];
yyleng = 0;
BEGIN OP;
}
<INITIAL,OP>[ \t]*
<OP>=[ \t]* {
op = yytext[0];
yyleng = 0;
BEGIN VAL;
}
<VAL>.*\n {
value = yytext;
BEGIN INITIAL;
return 1;
}
%%
推荐阅读
- vue.js - Adding image and text to Vue Select dropdown
- c# - System.IO.IOException:'进程无法访问文件'File',因为它正被另一个进程使用。'
- javascript - React 16.4 - 手动表单输入填充以及来自 getDerivedStateFromProps 的更新?
- abap - 自定义F4的新纪录
- sqlite - 是否可以获得在颤振中为 Android 模拟器创建的 SQLite 数据库的 GUI?
- mysql - 仅从 mysql 表中选择最后一个日志,使用多列的 DISTINCT
- javascript - 使用鼠标单击按钮和使用开发工具单击有什么区别?
- swift - @propertyWrapper 段错误
- ios - Visual Studio Xamarin - 使用 web 服务构建 realease iOS 项目的问题
- java - 无法生成 jar 的 openwms 和部署