我这里有一个非常基本的词法分析器:
import java_cup.runtime.*;
import java.io.IOException;
%%
%class AnalyzerLex
%function next_token
%type java_cup.runtime.Symbol
%unicode
//%line
//%column
// %public
%final
// %abstract
%cupsym sym
%cup
%cupdebug
%eofval{
return sym(sym.EOF);
%eofval}
%init{
// TODO: code that goes to constructor
%init}
%{
private Symbol sym(int type)
{
return sym(type, yytext());
}
private Symbol sym(int type, Object value)
{
return new Symbol(type, yyline, yycolumn, value);
}
private void error()
throws IOException
{
throw new IOException("Illegal text at line = "+yyline+", column = "+yycolumn+", text = '"+yytext()+"'");
}
%}
ANY = .
%%
{ANY} { return sym(sym.ANY); }
"n" { }
这是我最基本的解析器:
import java_cup.runtime.*;
parser code
{:
public void syntax_error(Symbol cur_token) {
System.err.println("syntax_error " + cur_token );
}
:}
action code
{:
:}
terminal ANY;
non terminal grammar;
grammar ::= ANY : a
{:
//System.out.println(a);
:}
;
我正在尝试解析示例文件。我做了一个这样的方法:
AnalyzerLex scanner = null;
ParserCup pc = null;
try {
scanner = new AnalyzerLex( new java.io.FileReader(argv[i]) );
pc = new ParserCup(scanner);
while ( !scanner.zzAtEOF ){
pc.parse_debug();
}
}
但是上面的代码抛出一个错误:
#2
Unexpected exception:
# Initializing parser
# Current Symbol is #2
# Shift under term #2 to state #2
# Current token is #2
syntax_error #2
# Attempting error recovery
# Finding recovery state on stack
# Pop stack by one, state was # 2
# Pop stack by one, state was # 0
# No recovery state found on stack
# Error recovery fails
Couldn't repair and continue parse at character 0 of input
java.lang.Exception: Can't recover from previous error(s)
at java_cup.runtime.lr_parser.report_fatal_error(lr_parser.java:375)
at java_cup.runtime.lr_parser.unrecovered_syntax_error(lr_parser.java:424)
at java_cup.runtime.lr_parser.debug_parse(lr_parser.java:816)
at AnalyzerLex.main(AnalyzerLex.java:622)
我认为我没有正确设置词法分析器/解析器。
我不是专家,但我可以建议你采取这些行动:
-
您可能必须指定从哪个非终结符开始,例如:
start with compilation_unit;
-
您可以通过添加行和列来增强语法错误方法,这样可以更清楚地显示错误所在。
public void syntax_error(Symbol s){ System.out.println("compiler has detected a syntax error at line " + s.left + " column " + s.right); }