我什至不知道从哪里开始编写逐字符的词法分析器。我根据给定的规则和细节为 Markdown 语言(特别是 HTML)编写了 BNF 语法规则,因此不需要添加任何内容。我现在必须设计和实现一个逐字符的词法分析器,它将我的 Markdown 语言中的源文件的词位划分为标记。这是我的 BNF 语法:
终端:
#DOCUMENT BEGIN,
#DOCUMENT END
#HEAD BEGIN,
#HEAD END,
#TITLE BEGIN,
#TITLE END,
#PARAGRAPH BEGIN,
#PARAGRAPH END,
#BOLD BEGIN,
#BOLD END,
#ITALICS BEGIN,
#ITALICS END,
#LIST BEGIN,
#LIST END,
#ITEM BEGIN,
#ITEM END,
#LINK BEGIN,
#TEXT,
#ADDRESS,
#LINK END,
#DEFINE BEGIN,
#NAME,
#VALUE,
#DEFINE END,
#USE BEGIN,
#USE END
请注意,这些终端不区分大小写。
非终端:
<document> ::= #DOCUMENT BEGIN <macro-‐define> <head> <body> #DOCUMENT END
<head> ::= #HEAD BEGIN <title> #HEAD END | ε
<title> ::= #TITLE BEGIN <text> #TITLE END | ε
<body> ::= <inner-‐text> <body>
| <paragraph> <body>
| <bold> <body>
| <italics> <body>
| <list> <body>
| ε
<paragraph> ::= #PARAGRAPH BEGIN <macro-‐define> <inner-‐paragraph> #PARAGRAPH END
<inner-‐paragraph> ::= <inner-‐text> <inner-‐paragraph>
| <bold> <inner-‐paragraph>
| <italics> <inner-‐paragraph>
| <list> <inner-‐paragraph>
| ε
<inner-‐text> ::= <macro-‐use> <inner-‐text>
| <text> <inner-‐text>
| ε
<macro-‐define> ::= #DEFINE BEGIN #NAME <text> #VALUE <body> #DEFINE END <macro-‐define>
| ε
<macro-‐use> ::= #USE BEGIN <text> #USE END | ε
<bold> ::= #BOLD BEGIN <macro-‐define> <inner-‐text> #BOLD END
<italics> ::= #ITALICS BEGIN <macro-‐define> <inner-‐text> #ITALICS END
<link> ::= #LINK BEGIN #TEXT <text> #ADDRESS <text> #LINK END
<list> ::= #LIST BEGIN #ITEM BEGIN <macro-‐define> <inner-‐list> #ITEM END <list-‐items> #LIST END
<list-‐items> ::= #ITEM BEGIN <macro-‐define> <inner-‐list> #ITEM END <list-‐items> | ε
<inner-‐list> ::= | <bold> <inner-‐list>
| <italics> <inner-‐list>
| <list><inner-‐list>
| <inner-‐text> <inner-‐list>
| ε
<text> ::= Any plain text | ε
我们可以假设诸如“<”、“>”、“&”和“/”之类的 HTML 字符不会出现在源文件的任何文本中。我们也可以假设“#”只出现在我们的 Markdown 注释之一之前(例如,#DOCUMENT)。我认为最好有单独的 Java 类来表示令牌对象,例如:DocumentBegin、DocumentEnd、ParagraphBegin、ParagraphEnd 等。遇到的任何词法错误(例如,#DOC BEGIN)都应该作为输出报告给控制台尽可能的错误信息。遇到第一个错误后,编译器应该退出。如果遇到错误,则不应创建输出文件。
我的问题是,我知道词法分析器应该做什么,但老实说,我不知道从哪里开始编码/实现。如果您需要更多关于问题所在的解释,请询问,我可以尽力解释。这是我们为我的班级准备的一个大项目的一部分。我无法完成这部分并失去了很多分数,但现在我只需要了解它,所以一旦我们对其进行测试,我就不会那么迷失了。