0

输入文件:
parameter1 abc
parameter2 123
parameter3 xyz
如果parameter2是强制定义的,而用户忘记了,可以用yacc报告这个缺失的变量吗?

4

2 回答 2

1

我将扩展我的评论并尝试做出正确的回答。yacc是一个做句法分析的工具,也就是分析单词或记号的语法排列。使用 yacc 生成的解析器将一串标记识别为有效,例如

a = b + 2

并拒绝一个无效的字符串,如

2 b a = +

存在相同的标记,但以不同的非语法顺序存在。

相反,像 grep 这样使用一些简单正则表达式的简单字符串匹配工具似乎是您的选择。正则表达式

/^parameter2/

匹配以字符串“parameter2”和正则表达式开头的任何行

/^parameter[0-9]\s*[0-9]+$/

匹配包含从 0 到 9 编号的参数、一些空格和一串数字组成的任何行。您还有其他选项可用于跨行匹配、不区分大小写匹配等。


现在,如果您的特定问题包括验证分配给参数的值的类型信息,例如,parameter2必须采用整数而不是字符串,那么 yacc 可能会很有用。但是,正如我所写的,我认为要设置很多设备来解决看似简单的问题。

于 2012-10-18T12:45:51.740 回答
0

您可以创建一个语法规则,规定parameter2必须在输入中恰好出现一次:

valid_file: opt_param_list param2 opt_param_list
    ;

然后,语法将仅将包含param2某处的文件识别为语法上有效的文件。

但是,您所追求的更多的是语义检查而不是句法检查。您可能会更好地在操作中而不是在语法中实施规则:

valid_file: opt_param_list
    {   if (param2_specified())
            YYACCEPT;
        else
        {
            err_report("No specification for parameter2");
            YYABORT;
        }
    }
    ;
于 2012-10-18T13:10:27.027 回答