gpt4 book ai didi

python - ANTLR 语法后缀

转载 作者:行者123 更新时间:2023-12-01 06:10:05 25 4
gpt4 key购买 nike

当我遇到一个问题时,我正在为一种小语言编写一个简单的语法。当我尝试解释它时,它抛出一个 NullPointerException 。哦,这是 ANTLRWorks 3。

另外 - 我指定语言应该是 Python,但它仍然在 Java 中执行操作:(为什么?

这是输入:

program Test1 = 
const t1 : int := 1;
const t2 : int := 2;
var x, y, z : int;
begin
x := 41;
y := 10;
z := 2 4 *;
end Test1.

这是我的代码:

grammar lang;

options {
language=Python;
output=AST;
ASTLabelType=CommonTree;
}

tokens {DECL;} // an imaginary node

start : decl ;

decl : type ID ';' -> ^(DECL type ID)
;
type : INTTYPE // automatic tree construction builds a node for this rule
| FLOATTYPE
;
program
: 'program' ID '='
(const | variable)*
'begin'
statement*
'end' ID '.'
;
const
: 'const' ID ':' type ':=' expr ';'
;
variable
: 'var' ID (',' ID)* ':' type ';'
;
statement
: assignment
;
assignment
: ID ':=' expr ';'
;



// expressions....fun!

term
: ID
| expr
| INTTYPE
;
negation
: 'not'* term
;
unary
: ('+' | '-')* negation
;
mult
: unary (unary ('*' | '/' | 'mod'))*
;
add
: mult (mult ('+' | '-'))*
;
relation
: add (add ('==' | '!=' | '<' | '<=' | '>=' | '>'))*
;

expr
: relation (relation ('and' | 'or'))*
;

INTTYPE : 'int' ;
FLOATTYPE : 'float' ;
ID : ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9')* ;
INT : '0'..'9'+ ;
WS : (' '|'\n' | '\t') {$channel=HIDDEN;} ;

我做错了什么?

最佳答案

正如 Kay 已经提到的:无需考虑后修复表达式中的运算符优先级。后缀表达式只是一个或多个操作数和运算符的列表。以下是如何让你的语法发挥作用:

grammar lang;

options {
language=Python;
output=AST;
}

tokens {
PROGRAM;
STATS;
DECL;
ASSIGN;
EXPR;
}

program
: 'program' id=ID '=' decl* 'begin' statement* 'end' ID '.'
-> ^(PROGRAM $id ^(DECL decl*) ^(STATS statement*))
;

decl
: const
| variable
;

type
: INTTYPE
| FLOATTYPE
;

const
: 'const' ID ':' type ':=' expr ';' -> ^('const' type ID expr)
;

variable
: 'var' ID (',' ID)* ':' type ';' -> ^('var' type ID+)
;

statement
: assignment
;

assignment
: ID ':=' expr ';' -> ^(ASSIGN ID expr)
;

expr
: exprAtom+ -> ^(EXPR exprAtom+)
;

exprAtom
: operand
| operator
;

operand
: INT
| ID
;

operator
: 'and' | 'or' | '==' | '!=' | '<' | '<=' | '>=' | '>' | '+' | '-' | '*' | '/' | 'mod' | 'not'
;

INTTYPE : 'int' ;
FLOATTYPE : 'float' ;
ID : ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9')* ;
INT : '0'..'9'+ ;
WS : (' '|'\n' | '\t') {$channel=HIDDEN;} ;

现在通过在命令行上执行以下命令来生成词法分析器和解析器(Python 源文件!):

java -cp antlr-3.1.3.jar org.antlr.Tool lang.g

And if you now execute the following script

#!/usr/bin/env python
import antlr3
from antlr3 import *
from antlr3.tree import *
from langLexer import *
from langParser import *

def print_level_order(tree, indent):
print '{0}{1}'.format(' '*indent, tree.text)
for child in tree.getChildren():
print_level_order(child, indent+1)

input = """
program Test1 =
const t1 : int := 1;
const t2 : int := 2;
var x, y, z : int;
begin
x := 41;
y := 10;
z := 2 4 *;
end Test1.
"""
char_stream = antlr3.ANTLRStringStream(input)
lexer = langLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = langParser(tokens)
tree = parser.program().tree
print_level_order(tree, 0)

您将看到以下内容打印到控制台:

PROGRAM
Test1
DECL
const
int
t1
EXPR
1
const
int
t2
EXPR
2
var
int
x
y
z
STATS
ASSIGN
x
EXPR
41
ASSIGN
y
EXPR
10
ASSIGN
z
EXPR
2
4
*

关于python - ANTLR 语法后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6347692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com