输入文件:
parameter1 abc
parameter2 123
parameter3 xyz
如果必须定义参数2并且用户忘记这样做,是否可以使用yacc来报告这个缺失的变量?
答案 0 :(得分:1)
我会扩展我的评论,并尝试做出正确的答案。 yacc是一种进行句法分析的工具,即分析单词或标记的语法排列。使用yacc生成的解析器将
之类的标记字符串识别为有效a = b + 2
并拒绝像
这样的字符串无效2 b a = +
存在相同的令牌,但是以不同的非语法顺序存在。
相反,像grep这样使用一些简单正则表达式的简单字符串匹配工具似乎是您的选择。正则表达式
/^parameter2/
匹配以字符串“parameter2”开头的任何行和正则表达式
/^parameter[0-9]\s*[0-9]+$/
匹配由编号为0到9的参数,一些空格和一串数字组成的任何行。您还可以选择跨行匹配,不区分大小写,等等。
现在,如果您的特定问题包括验证分配给参数的值的类型信息,例如,parameter2
必须采用整数而不是字符串,则yacc可能有用。但是,正如我所写,我认为设置阅读简单问题的设备很多。
答案 1 :(得分: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;
}
}
;