我正在尝试使用和理解 AntLR,这对我来说是新的。我的目的是读取用 C 编写的源代码文件并从中提取标识符(变量和函数名称)。
在我的 C 语法中(文件C.g4) 考虑:
identifierList
: Identifier
| identifierList Comma Identifier
;
Identifier
: IdentifierNondigit
( IdentifierNondigit
| Digit
)*
;
生成解析器和侦听器后,我创建了自己的标识符列表侦听器。
请注意,MyCListener 类扩展了 CBaseListener:
public class MyCListener extends CBaseListener {
@Override
public void enterIdentifierList(CParser.IdentifierListContext ctx) {
List<ParseTree> children = ctx.children;
for (ParseTree parseTree : children) {
System.out.println(parseTree.getText());
}
}
然后我在主课上有这个:
String fileurl = "C:/example.c";
CLexer lexer;
try {
lexer = new CLexer(new ANTLRFileStream(fileurl));
CommonTokenStream tokens = new CommonTokenStream(lexer);
CParser parser = new CParser(tokens);
CParser.IdentifierListContext identifierContext = parser.identifierList();
ParseTreeWalker walker = new ParseTreeWalker();
MyCListener listener = new MyCListener();
walker.walk(listener, identifierContext);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
其中 example.c 是:
int main() {
// this is C
int i=0; // i is int
/* double j=0.0;
C
*/
}
我究竟做错了什么?
也许我没有正确编写MyCListener,或者identifierList不是我需要监听的...真的不知道。抱歉,我什至不明白我的输出,为什么会有词法错误?:
line 3:4 mismatched input '(' expecting {<EOF>, ','}
main
(
)
{
int
i
=
0
;
}
正如你所看到的,我对此感到非常困惑。有人可以帮助我吗?请...