Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何确保用户始终在输入文件中添加特定令牌?_Regex_Yacc - Fatal编程技术网

Regex 如何确保用户始终在输入文件中添加特定令牌?

Regex 如何确保用户始终在输入文件中添加特定令牌?,regex,yacc,Regex,Yacc,输入文件: 参数1 abc 参数2 123 参数3 xyz 如果必须定义参数2,而用户忘记了这样做,那么可以使用yacc报告缺少的变量吗 我将进一步阐述我的评论,并尝试做出正确的回答。yacc是一种进行句法分析的工具,即分析单词或标记的语法排列。使用yacc生成的解析器将令牌字符串识别为有效的,如 a = b + 2 并将以下字符串视为无效而拒绝 2 b a = + 同样的标记也存在,但以不同的非语法顺序出现 相反,像grep这样使用一些简单正则表达式的简单字符串匹配工具似乎是您的选择。正则

输入文件:
参数1 abc
参数2 123
参数3 xyz

如果必须定义参数2,而用户忘记了这样做,那么可以使用yacc报告缺少的变量吗

我将进一步阐述我的评论,并尝试做出正确的回答。yacc是一种进行句法分析的工具,即分析单词或标记的语法排列。使用yacc生成的解析器将令牌字符串识别为有效的,如

a = b + 2
并将以下字符串视为无效而拒绝

2 b a = +
同样的标记也存在,但以不同的非语法顺序出现

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

/^parameter2/
/^parameter[0-9]\s*[0-9]+$/
匹配以字符串“parameter2”和正则表达式开头的任何行

/^parameter2/
/^parameter[0-9]\s*[0-9]+$/
匹配由编号为0到9的参数、一些空格和一串数字组成的任何行。您还有其他选项用于跨行匹配、不敏感地匹配大小写等



现在,如果您的特定问题包括验证分配给参数的值的类型信息,例如,
parameter2
必须采用整数,而不是字符串,那么yacc可能很有用。但是,正如我所写的,我认为这是一个非常简单的问题。

你可以创建一个语法规则,说
参数2
必须在输入中出现一次:

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;
        }
    }
    ;

一般来说,可以使用解析器(由yacc生成)和词法分析器(由lex等工具生成)来验证输入文件。但是这些工具是否合适取决于输入文件的可变性。文件是否总是最多3行,每行标题为“parameterN”?那么,一个更简单的解决方案,使用您喜欢的编程语言的字符串操作工具,而不使用yacc生成的解析器,对您来说可能是一个更好的选择。这样的行可以有100行。我在这里提到的只是一个例子。可以有不同名称和值的各种参数。所以这些都是命名参数,这对我来说顺序并不重要。在这种情况下,yacc不适合您的需要。想想像grep这样的工具。