gpt4 book ai didi

JavaCC 使用输入作为 'token'

转载 作者:行者123 更新时间:2023-12-02 07:09:35 25 4
gpt4 key购买 nike

我已经为此困惑了好几天,搜索似乎没有给出任何结果。让我想知道这是否可能。例如:

funct functionNAME (Object o) { o+1 };

重点是用户必须在大括号内使用标识符“o”,而不是其他标识符。这当然是由 (Object o) 部分中的输入指定的,其中“o”可以是任何内容。基本上,花括号内的标识符必须与参数中定义的标识符相同。我知道我可以存储匹配的标记并将其打印到屏幕上,但是是否可以将其用作词汇标记本身?谢谢。

最佳答案

是的,有更好的方法来做到这一点。您需要一个符号表。符号表的作用是跟踪程序中每个点可以使用哪些标识符。通常,符号表还包含有关标识符的其他信息,例如它们代表什么(例如变量或函数名称)以及它们的类型是什么。

使用符号表,您可以检测在解析许多语言(但不是全部)期间不在范围内的变量的使用。例如。 C 和 Pascal 是必须在使用标识符之前声明标识符的语言(有一些异常(exception))。但其他语言(例如 Java)允许在使用标识符后声明标识符,在这种情况下,最好不要在程序解析之前尝试检测错误,例如使用未声明的变量。 (事实上​​,在 Java 中,您需要等待所有文件都被解析,因为标识符可能在另一个文件中声明。)

我将假设一个简单的场景,即您只需要记录有关变量的信息,没有类型信息,并且必须在使用之前声明事物。这将帮助您开始。我没有费心将函数名称添加到符号表中。

假设符号表是一堆称为帧的东西。每个帧都是一组可变的字符串。 (稍后您可能希望将其更改为从字符串到一些附加信息的可变映射。)

void Start(): { }
{
<FUNCTION>
<IDENTIFIER>
{symttab.pushNewFrame() ;}
<LBRACKET> Parameters() <RBRACKET>
<LBRACE> Expression() <RBRACE>
{symtab.popFrame() ; }
}
void Parameters() : {}
{
( Parameter() (<COMMA> Parameter() )* )?
}
void Parameter() : { Token x ; }
<OBJECT> x=<IDENTIFIER>
{ if( symtab.topFrame().contains(x.image) ) reportError( ... ) ; }
{ symtab.topFrame().add(x.image) ; }
}
void Expression() : { }
{
Exp1() ( <PLUS> Exp1() )*
}
void Exp1() : { Token y ; }
{
y = <IDENTIFIER>
{ if( ! symtab.topFrame().contains(y.image) ) reportError( ... ) ; }
|
<NUMBER>
}

关于JavaCC 使用输入作为 'token',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15687968/

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