NFA 状态图的一种语言的语法 - Antlr v4
The grammar of a language of a NFA state diagram - Antlr v4
我正在尝试编写以下 NFA 图的语法
我的密码是
grammar LTFA;
rS: 'Start' rA | EOF;
rA: 'Select_coffe' rB;
rB: 'Enter_money' rC | 'Cancel' rS;
rC: 'More_money_needed' rC | 'Refund' rE | 'Right_amount_of_money' rD;
rD: 'Change' rC | 'Done' | 'Done' rS;
rE: 'End' | 'End' rS;
WS: ( ' ' | '\t' | '\n')->skip;
问题是语言不接受空字符串(空),我怎样才能接受空字符串??
这是我得到的错误
当运行这段代码:
LTFALexer lexer = new LTFALexer(CharStreams.fromString(""));
LTFAParser parser = new LTFAParser(new CommonTokenStream(lexer));
System.out.println(parser.rS().toStringTree(parser));
我在控制台中得到以下输出:
(rS <EOF>)
并且没有显示任何错误。
Python 中的测试结果相同:
from antlr4 import *
from LTFALexer import LTFALexer
from LTFAParser import LTFAParser
if __name__ == '__main__':
lexer = LTFALexer(InputStream(''))
parser = LTFAParser(CommonTokenStream(lexer))
print(parser.rS().toStringTree(recog=parser))
然后也打印(rS <EOF>)
。
这个任务可能无法完成。虽然您可以从语法生成状态机(ATN、NFA、DFA),但不可能反过来,因为状态不是规则,您不能仅从状态和转换创建规则。但是,您在这里尝试使用语法规则代替状态。
让我们看一个例子,你的规则rB
:
rB: 'Enter_money' rC | 'Cancel' rS;
你的状态图说你想要的是:
- 我们必须处于状态 Q2。
- 我们输入“Enter_money”.
- 我们最终进入状态 Q3。
或
- 我们输入“取消”。
- 我们最终进入状态 Q0。
但是规则说:
- 匹配输入“Enter_money”。
- 然后匹配规则
rC
(需要更多输入)
或
- 匹配输入“取消”。
- 然后匹配规则'rS'(需要整个链再次匹配)。
虽然您当然可以采用一组节点并将它们放入规则中以针对特定输入执行,但您将无法指示解析器解释器(或状态遍历器)最终处于特定状态(例如购买完成或取消后的开始状态)。
我正在尝试编写以下 NFA 图的语法
我的密码是
grammar LTFA;
rS: 'Start' rA | EOF;
rA: 'Select_coffe' rB;
rB: 'Enter_money' rC | 'Cancel' rS;
rC: 'More_money_needed' rC | 'Refund' rE | 'Right_amount_of_money' rD;
rD: 'Change' rC | 'Done' | 'Done' rS;
rE: 'End' | 'End' rS;
WS: ( ' ' | '\t' | '\n')->skip;
问题是语言不接受空字符串(空),我怎样才能接受空字符串??
这是我得到的错误
当运行这段代码:
LTFALexer lexer = new LTFALexer(CharStreams.fromString(""));
LTFAParser parser = new LTFAParser(new CommonTokenStream(lexer));
System.out.println(parser.rS().toStringTree(parser));
我在控制台中得到以下输出:
(rS <EOF>)
并且没有显示任何错误。
Python 中的测试结果相同:
from antlr4 import *
from LTFALexer import LTFALexer
from LTFAParser import LTFAParser
if __name__ == '__main__':
lexer = LTFALexer(InputStream(''))
parser = LTFAParser(CommonTokenStream(lexer))
print(parser.rS().toStringTree(recog=parser))
然后也打印(rS <EOF>)
。
这个任务可能无法完成。虽然您可以从语法生成状态机(ATN、NFA、DFA),但不可能反过来,因为状态不是规则,您不能仅从状态和转换创建规则。但是,您在这里尝试使用语法规则代替状态。
让我们看一个例子,你的规则rB
:
rB: 'Enter_money' rC | 'Cancel' rS;
你的状态图说你想要的是:
- 我们必须处于状态 Q2。
- 我们输入“Enter_money”.
- 我们最终进入状态 Q3。
或
- 我们输入“取消”。
- 我们最终进入状态 Q0。
但是规则说:
- 匹配输入“Enter_money”。
- 然后匹配规则
rC
(需要更多输入)
或
- 匹配输入“取消”。
- 然后匹配规则'rS'(需要整个链再次匹配)。
虽然您当然可以采用一组节点并将它们放入规则中以针对特定输入执行,但您将无法指示解析器解释器(或状态遍历器)最终处于特定状态(例如购买完成或取消后的开始状态)。