我看不出有任何方法可以完全避免编写正则表达式并将它们应用于这些文本文件的行。(没有迹象表明定义配置文件数据的整体语法。根据该语法编写解析器 - 可能 - 很容易。没有机会?)
我看到你必须解决两个问题。一种是识别某些关键字(例如“主机名”),另一种是某些模式的存在与否取决于前面的一行或多行。
为了解决第一个问题,我会(使用 Java 代码)将行分成以空格分隔的标记,以便每一行都变成 List。
第二个问题可以使用规则来解决。
rule "hostname"
when
Line( $n: number, $tok: tokens contains "hostname" )
eval( $tok.get( $tok.indexOf( "hostname" ) + 1 ).length() > 4 ) // incomplete
then
insert( new Correct( $n, "hostname" ) );
end
(请注意,布尔表达式必须防止 $tok 以“主机名”结尾。)为正确数据插入事实比为所有失败情况编写规则更容易。最后将有另一组规则检查所有需要的正确事实是否在工作记忆中。此外,可能需要检查重复的“主机名”定义,这可以使用正确的事实轻松完成。
让我们也看看另一个例子。
rule "interface"
when
Line( $n1: number, $tok: tokens contains "interface" )
Line( number == $n1 + 1, tokens not contains "disabled" )
Line( number == $n1 + 2,
tokens not contains "parameter" ||
tokens contains "parameter" && $tok.indexOf( "parameter" ) < $tok.size() - 1 )
then
insert( new Error( $n1, "interface configuration error" ) );
end
可能是 $tok.indexOf( "parameter" ) == 1 和 $tok.size() == 2 是必需的,但不知道这些要求的确切性质......在这里我也插入了一个否定结果用于在最后收集它,按行号排序等。
最后一点:我觉得这些验证要求的措辞太模糊了,除非你确信更严格的处理器能够处理糟糕的语法,或者规范实际上容忍了奇怪的措辞,例如, “没有他的戒指的主机名土星;-)”这是一个正确的行吗?它根据您的规则通过了测试...