2011-12-17 78 views
1

我試圖編寫非常簡單的HTML解析器與ANTLR和我面臨的問題,〜規則應該匹配所有,直到指定的字符不工作。antlr html pcdata

我的詞法語法:

lexer grammar HtmlParserLexer; 

HTML: OHTML PCDATA CHTML; 

PCDATA :(~'<') ; //match all until < 

OHTML: '<html>'; 

CHTML: '</html>'; 

我試着去匹配:從Eclipse的ANTLR插件解釋

<html>foo bar</html> 

錯誤:

MismatchedTokenException: line 1:7 mismatched input UNKNOW expecting '<' 

這意味着,我的語法忽略PCDATA規則我不知道爲什麼。 在此先感謝您的幫助。

回答

3

規則PCDATA :(~'<') ;與除'<'以外的單個字符匹配。您需要重複一次或多次:PCDATA :(~'<')+ ;(請注意+)。

您可能還想允許<html></html><html></html>之間沒有任何內容)。在這種情況下,你不應該改變PCDATA :(~'<')+ ;PCDATA :(~'<')* ;,但做到這一點,而不是:

HTML: OHTML PCDATA? CHTML; 

PCDATA : (~'<')+ ; 

,因爲你不應該創建一個可能匹配空字符串的詞法規則。

+0

謝謝你,那就是問題所在。我看到〜的例子重複,但我沒有嘗試它。我認爲它會匹配所有,直到給定的字符,而不使用重複... – matejuh 2011-12-18 10:53:50

+0

不客氣@matejuh。 – 2011-12-18 11:03:42