文字ごとの字句アナライザーをどこから書き始めればよいかさえわかりません。与えられたルールと仕様に基づいて、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 注釈の 1 つ (#DOCUMENT など) の前にのみ表示されると想定することもできます。DocumentBegin、DocumentEnd、ParagraphBegin、ParagraphEndなどのトークン オブジェクトを表すには、個別の Java クラスを用意するのが最善だと思います。発生した字句エラー (#DOC BEGIN など) は、できるだけ多くの情報とともにコンソールに出力として報告する必要があります。可能な限りエラー情報。コンパイラは、最初のエラーが発生した後に終了する必要があります。エラーが発生した場合、出力ファイルは作成されません。
私の問題は、語彙アナライザーが何をすべきかを知っていますが、正直なところ、コーディング/実装をどこから始めればよいかわかりません。問題が何を求めているのかについてさらに説明が必要な場合は、お気軽にお尋ねください。できる限り説明します。これは、私のクラスに予定されていた大きなプロジェクトの一部でした。この部分を完了できず、多くのポイントを失いましたが、今はそれを理解する必要があるだけなので、テストを受ければそれほど迷うことはありません.