avatar
清教关于编译原理# Java - 爪哇娇娃
f*y
1
我用javacc做一个简单语法分析
token定义如下
TOKEN :
{

|
|
|
< FUNC: ["a"-"z"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* >
|

|
< ID: ( ["a"-"z","A"-"Z","_","0"-"9"] )+ >
}
FUNC指函数名,ID指任意字符窜,就是说这样的情况是合法的FUNC(ID)

不过这样的问题是ID的定义包含FUNC,就是在解析的时候,比如遇到test,就不知道是
FUNC还是ID。
这里规定如果函数如果没有参数就省去括号,比如done和test(d)都可以是函数。
所以不知道如何定义,函数名和ID可以解析的时候可以区别。
avatar
c*r
2
In general, ID refers to both function ID and variable ID.
To differetiate them, one way is that function ID is always followed
by "(" like java or c.
Another way is whenever you declare a function or variable, add the ID
to the symbol table. When you encounter the ID, you can look up the symbol
table and see if it is function ID or variable ID.

【在 f****y 的大作中提到】
: 我用javacc做一个简单语法分析
: token定义如下
: TOKEN :
: {
:
: |
: |
: |
: < FUNC: ["a"-"z"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* >
: |

avatar
f*y
3
hi, thanks for suggestion.
1)这里的函数和java,c的有点不一样,就是不带参数的时候,省去括号,这样形式上就
和变量一样了。
如果我定义函数这样,function-> FuncID|(func"("),就是带括号,或没有括号,这样
还是存在FuncID和ID冲突的问题。
这样如何解决。
这里函数名一定是小写字母开始,ID是任意数字,字母组合。
2)第二个方法,我不是很明白。怎么能区别function ID 还是 variable ID?

【在 c****r 的大作中提到】
: In general, ID refers to both function ID and variable ID.
: To differetiate them, one way is that function ID is always followed
: by "(" like java or c.
: Another way is whenever you declare a function or variable, add the ID
: to the symbol table. When you encounter the ID, you can look up the symbol
: table and see if it is function ID or variable ID.

avatar
c*r
4
If the grammar is ambiguous then it is impossible to differentiate them.
For example,
f(x)=x+1; //declaring a function
f=10; //is it a function or variable?
So you have to make your grammar clear, like
function f = 10; //"function" is a reserved word
or
f { // functions are followed by "{"
return 10;
}
In the second case, you can lookahead "{"



道是


【在 f****y 的大作中提到】
: hi, thanks for suggestion.
: 1)这里的函数和java,c的有点不一样,就是不带参数的时候,省去括号,这样形式上就
: 和变量一样了。
: 如果我定义函数这样,function-> FuncID|(func"("),就是带括号,或没有括号,这样
: 还是存在FuncID和ID冲突的问题。
: 这样如何解决。
: 这里函数名一定是小写字母开始,ID是任意数字,字母组合。
: 2)第二个方法,我不是很明白。怎么能区别function ID 还是 variable ID?

avatar
f*y
5
yes. I understand what you are saying. Thanks I will look it further.

【在 c****r 的大作中提到】
: If the grammar is ambiguous then it is impossible to differentiate them.
: For example,
: f(x)=x+1; //declaring a function
: f=10; //is it a function or variable?
: So you have to make your grammar clear, like
: function f = 10; //"function" is a reserved word
: or
: f { // functions are followed by "{"
: return 10;
: }

avatar
f*y
6
语法定义里有关键字,比如if,then之类,比如java不会允许变量名是这样底关键字,这种
情况是怎么实现的,怎么处理的?
另外一个问题,正则表示里有没有与的表示,比如或是|. 要定义一个变量是任意字母组合
,但是不能是"good"(比如),这种怎么表示的?

【在 c****r 的大作中提到】
: If the grammar is ambiguous then it is impossible to differentiate them.
: For example,
: f(x)=x+1; //declaring a function
: f=10; //is it a function or variable?
: So you have to make your grammar clear, like
: function f = 10; //"function" is a reserved word
: or
: f { // functions are followed by "{"
: return 10;
: }

avatar
d*p
7
你做词法分析时,先看是不是关键词,再识别标示符。
就是说,识别关键词的规则的优先级要比识别标示符
的规则优先级高。

【在 f****y 的大作中提到】
: 语法定义里有关键字,比如if,then之类,比如java不会允许变量名是这样底关键字,这种
: 情况是怎么实现的,怎么处理的?
: 另外一个问题,正则表示里有没有与的表示,比如或是|. 要定义一个变量是任意字母组合
: ,但是不能是"good"(比如),这种怎么表示的?

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。