【发布时间】:2019-04-29 14:59:40
【问题描述】:
在我的语法文件中,我希望 ANTLR 将我的输入读取为 2 个标记而不是 1 个。 在我的源文件中,我有值
12345.name
词法分析器使用
12345.
作为浮动令牌。在源文件的这个特定点,我希望 ANTLR 将其读取为
- 12345 (INT)
- 。 (点)
- 姓名(姓名)
有没有办法告诉 ANTLR 它应该在某个给定点忽略 FLOAT-Types?
这是我当前的 .g4 文件:
grammar Quest;
import Lua;
@header {
package dev.codeflush.m2qc.antlr;
}
/*
prefixed everything with "m2" to avoid nameclashes
*/
m2QuestFile
: m2Define* m2Quest* EOF
;
m2Define
: 'define' NAME m2DefineValue
;
m2DefineValue
: ~('\r\n' | '\r' | '\n')
;
m2Quest
: 'quest' NAME 'begin' m2State* 'end'
;
m2State
: 'state' NAME 'begin' (m2TriggerBlock | m2Function)* 'end'
;
m2TriggerBlock
: 'when' m2Trigger ('or' m2Trigger)* ('with' exp)? 'begin' block 'end'
;
m2Function
: 'function' NAME funcbody
;
m2Trigger
: m2TriggerTarget DOT m2TriggerEvent DOT m2TriggerSubEvent DOT m2TriggerArgument
| m2TriggerTarget DOT m2TriggerEvent DOT m2TriggerArgument
| m2TriggerTarget DOT m2TriggerEvent
| m2TriggerEvent
;
m2TriggerTarget
: NAME
| INT
| NORMALSTRING
;
/*
not complete
*/
m2TriggerEvent
: 'button'
| 'enter'
| 'info'
| 'item_informer'
| 'kill'
| 'leave'
| 'letter'
| 'levelup'
| 'login'
| 'logout'
| 'unmount'
| 'target'
| 'chat'
| 'timer'
| 'server_timer'
;
m2TriggerSubEvent
: 'click'
| 'chat'
| 'arrive'
;
m2TriggerArgument
: exp
;
DOT
: '.'
;
我正在使用 https://github.com/antlr/grammars-v4/blob/master/lua/Lua.g4 的 Lua 语法
我当前的示例输入文件如下所示:
quest test begin
state start begin
when kill begin
end
when "12345".kill begin
end
when 12345.kill begin
end
end
end
前两个按预期工作,但第三个没有(因为词法分析器将 '12345.' 作为一个 FLOAT-Token 读取)
【问题讨论】:
-
是否可以选择在全局浮点文字的点后要求至少一位数字?
-
@sepp2k 是的,这也适用于我。谢谢你:)