我刚刚开始使用 ANTLR,我无法破译我在哪里搞砸了不匹配的输入错误

发布于 2025-01-15 13:19:44 字数 1579 浏览 0 评论 0原文

我刚刚开始使用 antlr,所以我非常感谢您的帮助!我只是想制定一个变量声明声明规则,但它不起作用!我已将我正在使用的文件放在下面,如果您需要其他任何内容,请 lmk!

输入代码:

var test;

GRAMMAR G4 文件:


grammar treetwo;

program : (declaration | statement)+ EOF;

declaration :
            variable_declaration
            | variable_assignment
            ;

statement:
        expression
        | ifstmnt
        ;

variable_declaration:
                    VAR NAME SEMICOLON
                    ;

variable_assignment:
                    NAME '=' NUM SEMICOLON
                    | NAME '=' STRING SEMICOLON
                    | NAME '=' BOOLEAN SEMICOLON
                    ;

expression:
            operand operation operand SEMICOLON
            | expression operation expression SEMICOLON
            | operand operation expression SEMICOLON
            | expression operation operand SEMICOLON
            ;

ifstmnt:
        IF LPAREN term RPAREN LCURLY
        (declaration | statement)+
        RCURLY
        ;


term:
    | NUM EQUALITY NUM
    | NAME EQUALITY NUM
    | NUM EQUALITY NAME
    | NAME EQUALITY NAME
    ;

/*Tokens*/
NUM : '0' | '-'?[1-9][0-9]*;
STRING: [a-zA-Z]+;
BOOLEAN: 'true' | 'false';
VAR : 'var';
NAME : [a-zA-Z]+;


SEMICOLON : ';';
LPAREN: '(';
RPAREN: ')';
LCURLY: '{';
RCURLY: '}';
EQUALITY: '==' | '<' | '>' | '<=' | '>=' | '!=' ;

operation: '+' | '-' | '*' | '/';
operand: NUM;
IF: 'if';
WS  :  [ \t\r\n]+ -> skip;

我收到错误:

(line 1,char 0): mismatched input 'var' expecting {NUM, 'var', NAME, 'if'}

I've just started using antlr so Id really appreciate the help! Im just trying to make a variable declaration declaration rule but its not working! Ive put the files Im working with below, please lmk if you need anything else!

INPUT CODE:

var test;

GRAMMAR G4 FILE:


grammar treetwo;

program : (declaration | statement)+ EOF;

declaration :
            variable_declaration
            | variable_assignment
            ;

statement:
        expression
        | ifstmnt
        ;

variable_declaration:
                    VAR NAME SEMICOLON
                    ;

variable_assignment:
                    NAME '=' NUM SEMICOLON
                    | NAME '=' STRING SEMICOLON
                    | NAME '=' BOOLEAN SEMICOLON
                    ;

expression:
            operand operation operand SEMICOLON
            | expression operation expression SEMICOLON
            | operand operation expression SEMICOLON
            | expression operation operand SEMICOLON
            ;

ifstmnt:
        IF LPAREN term RPAREN LCURLY
        (declaration | statement)+
        RCURLY
        ;


term:
    | NUM EQUALITY NUM
    | NAME EQUALITY NUM
    | NUM EQUALITY NAME
    | NAME EQUALITY NAME
    ;

/*Tokens*/
NUM : '0' | '-'?[1-9][0-9]*;
STRING: [a-zA-Z]+;
BOOLEAN: 'true' | 'false';
VAR : 'var';
NAME : [a-zA-Z]+;


SEMICOLON : ';';
LPAREN: '(';
RPAREN: ')';
LCURLY: '{';
RCURLY: '}';
EQUALITY: '==' | '<' | '>' | '<=' | '>=' | '!=' ;

operation: '+' | '-' | '*' | '/';
operand: NUM;
IF: 'if';
WS  :  [ \t\r\n]+ -> skip;

Error I'm getting:

(line 1,char 0): mismatched input 'var' expecting {NUM, 'var', NAME, 'if'}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不念旧人 2025-01-22 13:19:45

您的 STRING 规则与您的 NAME 规则相同。

使用 ANTLR 词法分析器,如果两个词法分析器规则匹配相同的输入,则将使用声明的第一个规则。因此,您永远不会看到 NAME 令牌。

大多数教程都会显示您必须转储令牌流。在深入了解解析器规则之前,查看令牌流并验证词法分析器规则通常是个好主意。

Your STRING rule is the same as your NAME rule.

With the ANTLR lexer, if two lexer rules match the same input, the first one declared will be used. As a result, you’ll never see a NAME token.

Most tutorials will show you have to dump out the token stream. It’s usually a good idea to view the token stream and verify your Lexer rules before getting too far into your parser rules.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文