flex-lexer - JFlex - lex 结构化文档
问题描述
下图表示我需要 lex 的代码。
该文档具有以下格式(以列术语表示):
1 - 5: comment
6 - 79: actual code
80 - ..: comment
如果我只需要对中间部分进行 lex,则根本不会有任何问题。
不幸的是,初始注释和终止注释始终存在于文档中。
关于如何实施的任何想法?
我正在考虑实现一个两阶段词法分析器,但我的想法仍然有点混乱。
解决方案
问题
If I only had to lex the middle part, there would be no issues at all. Unfortunately,
the initial and terminating comment are always present in the document. Any ideas on
how this could be implemented?
第一个解决方案
我会在词法分析器中添加一条匹配任何字符的规则,作为最后一条规则,如果您在第 1 到第 5 列或第 79 列之外,我会修改这些函数以返回一个空格符号,就像这样(假设类型为空间是20):
%{
private Symbol symbol(int type) {
if((yycolumn >= 1 && yycolumn <= 5) || yycolumn > 79)
type = 20;
return new Symbol(type, yyline, yycolumn);
}
private Symbol symbol(int type, Object value) {
if((yycolumn >= 1 && yycolumn <= 5) || yycolumn > 79)
type = 20;
return new Symbol(type, yyline, yycolumn, value);
}
%}
该解决方案保留列信息。如果您需要保留评论,则创建一个评论字符标记并返回它而不是空格标记。
第二种解决方案
或者我会在词法分析器中添加两条规则,匹配每行中的第一个注释并返回长度为 5 的空白标记:
^.....
还有一个匹配每行中的第二个注释并返回一个带有注释长度的空白标记:
^(?<=...............................................................................).*
我从来没有在JFlex中使用过非捕获“仅在前面” ,所以我不知道它是否受支持。对不起。
该解决方案保留列信息。同样,如果您需要保留评论,则返回评论标记,否则返回空白标记。
第三个解决方案
或者我会编写两个词法分析器,第一个用空格替换每行中的前 5 个字符(以保留第二个词法分析器的列信息)并删除第 79 列之后的字符。
第一个词法分析器可以用任何语言编写,也可以使用命令行工具sed(或类似工具)来完成。这是使用sed的示例:
sed的输入名为input.txt:
ABCDE67890123456789012345678901234567890123456789012345678901234567890123456789FGHJKL
ABCDEThis is the text we want, not the start and not the end of the line. FGHJKL
sed命令:
sed 's/^.....\(..........................................................................\).*$/\1/' input.txt > output.txt
sed的输出名为output.txt:
67890123456789012345678901234567890123456789012345678901234567890123456789
This is the text we want, not the start and not the end of the line.
您可以通过在命令的替换部分插入 5 个空格来修改脚本以保留列位置,但它不适合返回注释。
推荐阅读
- python - 如何将一个列表分成几个列表
- c# - 此函数必须从 UI 线程调用
- java - 使用 luben 的 ZSTD 字符串压缩
- python - 试图将伪代码转换为 Python 代码
- vba - 您如何在 VBA 中指定货币文字
- react-native - 如何使用 react-native 应用程序中的语言下拉菜单翻译移动应用程序文本?
- heroku - Strapi + Heroku 部署失败:npm ERR!代码 ERESOLVE
- sql - 获取第二个最大日期json对象(postgres)
- python - 如何解决错误“发生错误:Django/Python3 应用程序没有此类文件或目录”
- c++ - 为什么我需要使用队列
q 并且不能使用队列 问?