首页 > 解决方案 > JFlex - lex 结构化文档

问题描述

下图表示我需要 lex 的代码。
该文档具有以下格式(以列术语表示):

 1 -  5:     comment
 6 - 79:     actual code
80 - ..:     comment

RPG自由格式代码

如果我只需要对中间部分进行 lex,则根本不会有任何问题。
不幸的是,初始注释和终止注释始终存在于文档中。

关于如何实施的任何想法?
我正在考虑实现一个两阶段词法分析器,但我的想法仍然有点混乱。

标签: flex-lexerjflex

解决方案


问题

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 个空格来修改脚本以保留列位置,但它不适合返回注释。


推荐阅读