Parser/语法分析程序忽略不完整的语法规则
题
我有一个分析程序和语法分析程序编写ocamlyacc和ocamllex.如果该文件分析过早结束,因为在我忘记号在结束的一线的应用程序不提高语法错误。我意识到它是因为我抚养和捕EOF和做语法分析程序忽视未完成的规则,但如何 应该 我可以这样做,以提高语法错误?
这是我的电流分析器(简体)、
%{
let parse_error s = Printf.ksprinf failwith "ERROR: %s" s
%}
%token COLON
%token SEPARATOR
%token SEMICOLON
%token <string> FLOAT
%token <string> INT
%token <string> LABEL
%type <Conf.config> command
%start command
%%
command:
| label SEPARATOR data SEMICOLON { Conf.Pair ($1,$3) }
| label SEPARATOR data_list { Conf.List ($1,$3) }
| label SEMICOLON { Conf.Single ($1) }
label :
| LABEL { Conf.Label $1 }
data :
| label { $1 }
| INT { Conf.Integer $1 }
| FLOAT { Conf.Float $1 }
data_list :
| star_data COMMA star_data data_list_ending
{ $1 :: $3 :: $4 }
data_list_ending:
| COMMA star_data data_list_ending { $2 :: $3 }
| SEMICOLON { [] }
和lexxer(简体)、
{
open ConfParser
exception Eof
}
rule token = parse
| ['\t' ' ' '\n' '\010' '\013' '\012']
{ token lexbuf }
| ['0'-'9']+ ['.'] ['0'-'9']* ('e' ['-' '+']? ['0'-'9']+)? as n
{ FLOAT n }
| ['0'-'9']+ as n { INT n }
| '#' { comment lexbuf }
| ';' { SEMICOLON }
| ['=' ':'] { SEPARATOR }
| ',' { COMMA }
| ['_' 'a'-'z' 'A'-'Z']([' ']?['a'-'z' 'A'-'Z' '0'-'9' '_' '-' '.'])* as w
{ LABEL w }
| eof { raise Eof }
and comment = parse
| ['#' '\n'] { token lexbuf }
| _ { comment lexbuf }
例如输入的文件,
one = two, three, one-hundred;
single label;
list : command, missing, a, semicolon
一个解决方案,就是添加一个循环呼叫,在该命令的规则本身在末尾,加入一个空规则,所有这些都建立一个清单,返回的主要程序。我想我也许解释Eof作为一种期望,和结束状况,而不是一个错误的语法分析程序,这是正确的吗?
解决方案
ocamlyacc
不一定消耗的整个输入。如果你想要迫使它失败,如果整个输入不是分析能力,需要相匹配 EOF
在你的语法。而不是升高 Eof
在你语法分析程序,加入令牌 EOF
并改变你 start
符号
%type <Conf.config list> main
main:
EOF { [] }
| command main { $1::$2 }
不隶属于 StackOverflow