Parsing 语法分析器建议(ANTLR)

Parsing 语法分析器建议(ANTLR),parsing,antlr,qbasic,Parsing,Antlr,Qbasic,我想在Antlr4上写一个简单的QBasic语法。而“Else If”循环不能正常工作,它会在之后自动转换为assigncommand。你能复习一下我的语法吗?有什么改进吗 如何用正则表达式编写字符串(也使用西里尔字母) 我应该写这些关键词吗('PRINT'',如果')?或者使用lexer(比如。PRINTKEY;PRINTKEY:'PRINT') 语法Hello3; //分配指挥;主指挥部;FlowCommand prog:(assigncommand | main命令| flowcomman

我想在Antlr4上写一个简单的QBasic语法。而“Else If”循环不能正常工作,它会在
之后自动转换为
assigncommand
。你能复习一下我的语法吗?有什么改进吗

如何用正则表达式编写
字符串(也使用西里尔字母)

我应该写这些关键词吗(
'PRINT'',如果'
)?或者使用lexer(比如
。PRINTKEY;PRINTKEY:'PRINT'

语法Hello3;
//分配指挥;主指挥部;FlowCommand
prog:(assigncommand | main命令| flowcommand)+;
//转让;赋值字符串
//MyAge=以前的年龄+1
//MyName$=FirstName$+MiddleName$+LastName$
assigncommand:assignint | assignstring;
assignint:IDINT'='(IDINT | INT)(运算符形式(IDINT | INT))*'\n'+;
assignstring:IDSTRING'='(IDSTRING | STRING)('+'(IDSTRING | STRING))*'\n'+;
//PrintCommand,InputCommand
//打印MyName$,MyAge,“你好”,123
//输入“你叫什么名字?”,你的名字$
//(或)输入您的姓名$
main命令:printcommand | inputcommand;
printcommand:'PRINT'(','(IDINT | IDSTRING | STRING | INT))+'\n'+;
inputcommand:'INPUT'(IDIT | IDSTRING | STRING)?,'(IDINT | IDSTRING)“\n'+;
//如果ElseFlow;水流
//如有其他补充;其他添加
//
//如果a>3,则
//打印
//a=a-1
//否则,如果a=1,则
//b=a
//如果结束
//
//而a>3
//a=a-1
//打印
//温德
flowcommand:ifelseflow | whileflow;
ifelseflow:'如果'conditionflow',则''\n'如果''+'则''ifelseadd*elseadd*'结束';
whileflow:'WHILE'conditionflow'\n'(assigncommand | main command | flowcommand)*'WEND'\n'+;
条件流:((INT | idit)运算符工具(INT | idit))|((STRING | IDSTRING)='(STRING | IDSTRING));
ifelseadd:'ELSEIF'conditionflow'然后''\n'((assigncommand | main command | flowcommand)'\n')+;
elseadd:'ELSE'\n'((assigncommand | main Command | flowcommand)'\n')+;
//莱克斯
内部:[0-9]+;
字符串:''''[a-zA-Z\u0400-\u04FF\0-9''?''':']+'';
IDIT:[a-zA-Z]([a-zA-Z0-9]*)//我的年龄
IDSTRING:[a-zA-Z]([a-zA-Z0-9]*)“$”//我的名字$
运算符名称:“+”|“-“|”*“|”/”;

运算符工具:'='|'>'|'='|'与您一样,我发现在类BASIC语言中实现
if..else
构造是一个真正的挑战。我在网上找到了一些很好的资源。请看一下我的语法剪报:

ifstmt
:   IF condition_block (ELSE IF condition_block)* (ELSE stmt_block)?
;

condition_block
:   expr stmt_block
;

stmt_block
:   OBRACE statement+ CBRACE
|   statement
;
以及我的实现(在C#visitor模式中):

我从Bart Kiers对其
Mu
语言的出色实现中借用了
MuValue
思想。他的那个项目有很多好主意

ifstmt
:   IF condition_block (ELSE IF condition_block)* (ELSE stmt_block)?
;

condition_block
:   expr stmt_block
;

stmt_block
:   OBRACE statement+ CBRACE
|   statement
;
    public override MuValue VisitIfstmt(LISBASICParser.IfstmtContext context)
    {
        LISBASICParser.Condition_blockContext[] conditions = context.condition_block();
        bool evaluatedBlock = false;
        foreach (LISBASICParser.Condition_blockContext condition in conditions)
        {
            MuValue evaluated = Visit(condition.expr());
            if (evaluated.AsBoolean())
            {
                evaluatedBlock = true;
                Visit(condition.stmt_block());
                break;
            }
        }
        if (!evaluatedBlock && context.stmt_block() != null)
        {
            Visit(context.stmt_block());
        }
        return MuValue.Void;
    }